我一直试图理解加载php作为apache模块与其余模块的确切含义/目的.
当php作为apache模块安装时,究竟会发生什么?例如,每次发出php请求或单独加载php模块时,是否会读取php-ini文件?
我有关于在不同的配置中运行PHP的基本想法,如mod_php,cgi,FastCGI等.
在我的发现和测试中,我发现FastCGI略胜一筹.我最喜欢FastCGI对SuEXEC的支持.等等我不想再次进入基准测试业务.如果你上网,你会发现在每秒处理的请求数量方面,证明一种方式比另一种更快的人.那么它的好指标,但我对不同的因素感兴趣,这是我的问题......
请注意,我对DIGG或交通高峰的生存兴趣不大.我想要一种可以使服务器稳定和可预测的方法.
对不起,如果我很困惑,但我真的很乱.我有512MB物理内存,400MB交换和我的服务器疯狂的内存不足.平均内存需求大约为350MB,只是内存使用量激增使得内存几秒钟无法访问,如果在那几秒钟窗口中收到的额外点击很少,则apache在mysql和所有其他fellas运行正常时崩溃.
请帮帮我们.我不会买更多的RAM或硬件.我很确定问题出在我的配置中.对不起,如果我听起来傲慢或无知.
几个月前我有这样的问题.现在为了隔离问题,我尝试了一种新的方法.我把一个空文件放到我的服务器上.
文件名是"foobar.php".其内容如下:
<?php
echo "hello world";
Run Code Online (Sandbox Code Playgroud)
但是当我尝试进入example.com/foobar.php时,我明白了
DNS 203毫秒
连接3.33秒
发送0毫秒
到第一个字节的时间17.35秒
接收1毫秒总加载时间20.88秒
然后我把另一个名为"foobar.txt"的文件.其内容如下:
hello world<br/>
Run Code Online (Sandbox Code Playgroud)
foobar.txt的加载时间约为0.2秒.
这个网站是在共享主机内,所以我无法获得root Linux访问权限.我试图找出是什么让我的网站变慢.
MaxClients 300
MaxRequestsPerChild 4000
ThreadsPerChild 25
新编辑: 我和我的托管公司谈过.并告诉他们"foobar.php"几乎在20秒内打开.虽然该文件根本没有代码.他们告诉我他们把"foobar.php"放到我们使用同一台服务器的其他网站上.我也试过"othersite.com/foobar.php".它立刻打开了.但"mysite.com/foobar.php"几乎在15秒内开启.什么会造成这种行为?我们对其他网站使用相同的PHP配置,但它们会立即打开..可以是因为我的.htaccess规则吗?还是其他的事情?
新Edit2: 我的提供商告诉我服务器内没有"apd.so"文件.所以我好像不能使用APD.
我应该寻找什么才能找到瓶颈?
什么会限制我的网站?
附加数据:来自phpinfo,我得到了这个:
'./configure'' - prefix =/usr/local/lsws/lsphp5'' - build = x86_64-redhat-linux-gnu'' - host = x86_64-redhat-linux-gnu'' - target = x86_64-redhat-linux-gnu'' - sysconfdir =/etc'' - datadir =/usr/share'' - includenid =/usr/include'' - libdir =/usr/lib64'' - libdcdir =/usr/libexec'' …
例如,它是更安全的使用mod_php
,而不是php-cgi
?或者使用它mod_perl
而不是传统更安全cgi-scripts
?
我主要对安全问题感兴趣,但如果存在显着差异,速度可能会成为一个问题.
管理员已在我们的共享PHP 5.3.0服务器中安装了Xdebug 2.1.1,以便使用其调试器.现在,我几乎无法读取未捕获异常的堆栈跟踪,因为它们被Xdebug格式化,其中令人讨厌的颜色与网站的CSS交互不良:
由于PHP作为Apache模块运行,我试图在.htaccess
文件中禁用此功能,但我无法实现:
php_flag xdebug.default_enable Off
php_flag xdebug.overload_var_dump Off
php_flag xdebug.show_exception_trace Off
php_value xdebug.trace_format 1
Run Code Online (Sandbox Code Playgroud)
phpinfo()
在Local Value列中显示我的更改,但我仍然可以看到那些可怕的橙色表.我需要改变的指令是什么?
我一直在寻找好几天,看看有没有人做过良好的,有文档记录的,PHP处理速度之间的比较
和
为什么我要看:我看到的唯一测试是基准测试,提供完整页面或Hello,类似世界的测试,没有关于测试内容的正确文档.我不关心请求/秒,硬件,但我确实需要看看测试了什么PHP脚本以及具体配置.
为什么这两个: mod_php被认为是处理PHP最快的(没有静态文件,没有请求/响应测量,只是处理PHP本身)但是从那以后发生了很多变化,包括apache版本.nginx的和PHP-FPM吃得少了很多的内存,所以这会是一个很好的理由来改变架构,但如果他们不够快在这种情况下,变化是不相关的.
我知道如果我找不到一个我必须自己做,但我不敢相信没有人做过这样的测试到目前为止:)
所以,我需要在一台服务器上运行多个php应用程序/站点.一个或多个应该使用apache和mod_php5运行,一个或多个应该能够使用mod_fastcgi和php-fpm运行.mod_php5目前是正常的,如果我禁用mod_php5,fastcgi工作,但我很难让他们同时工作.
我认为这可以通过在apache中使用文件匹配,if.mod_fastcgi和if.mod_actions的某种组合来实现,但我无法弄清楚它是什么.如果需要,我们可以安装执行此操作所需的任何apache模块.
超级奖励积分,如果有不同版本的vhost for Apache 2.2或更少,你也有这个片段,或者至少知道我应该做什么
我不会发布我拥有的整个虚拟主机,因为我知道它们是错的,但第一个,默认的,基于mod_php的虚拟主机看起来像这样...
#NameVirtualHost 127.0.0.1:80 < Apache 2.2 or less
<VirtualHost 127.0.0.1:80>
ServerAdmin webmaster@localhost
ServerName some.site.tld
DocumentRoot /var/www/some/site/
<Directory /var/www/some/site/>
Options Indexes FollowSymLinks MultiViews
Require all granted
# Order deny,allow < Apache 2.2 or less
# Allow from all < Apache 2.2 or less
</Directory>
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望这些保持不变,如果我们需要更多这些,我们可以添加更多.
我想要的结果是能够使用像第一个配置这样的东西来放入为mod_php配置的新vhosts,并且还为了快速cgi而放入vhosts,如下所示.
# NameVirtualHost 0.0.0.0:80 < Apache 2.2 or Less
<VirtualHost 0.0.0.0:80>
ServerAdmin webmaster@localhost
ServerName some.application.tld
DocumentRoot /opt/some/app/dir/
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
<IfModule mod_fastcgi.c> …
Run Code Online (Sandbox Code Playgroud) 有没有人知道在执行长PHP
脚本时是否可以检测浏览器是否已关闭连接,何时使用apache
和mod_php
?
例如,在浏览器关闭它之后,如果有人试图写入它Java
,HttpOutputStream
则会抛出一个exception
- 或者会对它做出负面反应checkError()
.
我正在尝试为某些PHP脚本增加允许的内存.不管我做什么,例如:
ini_set('memory_limit', '512M');
Run Code Online (Sandbox Code Playgroud)
...脚本总是耗尽大约300MB的内存:
Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255
Run Code Online (Sandbox Code Playgroud)
我通过几种方式验证了memory_limit
实际上已经改变了.问题似乎是PHP无法物理分配总共300 MB的内存(25165824字节+ 343810589字节= 352 MB).
我已经在两台不同的基于Windows的计算机上尝试过PHP/5.3.0和PHP/5.3.9,并且具有以下规范:
我知道使用一半的物理RAM会强制交换并减慢速度,但我只需确保脚本实际工作,以便可以部署到实时服务器.我也尝试过更大的值(产生相同的错误)和更小的值(使我的脚本达到极限或使Apache崩溃).
这个明显硬编码内存限制的来源是什么?
更新#1:我已经使用Windows Server 2003框(实际上是VMWare虚拟机)进行了进一步测试.我已经将"物理"RAM增加到2 GB,并且我已经验证了分页文件可以增长到1152 MB.任务管理器显示当前事务负载为886 MB,并且有1.5 GB的可用物理内存.但是,我得到了完全相同的数字相同的错误.
更新#2:正如我所说,该memory_limit
指令没问题.它出现在两者ini_get()
和phpinfo()
.你得到的错误信息与我的略有不同; 我的表示PHP 崩溃.请比较:
Out of memory (allocated 25165824) (tried to allocate 343810589 bytes)
Allowed memory size of 25165824 bytes exhausted (tried to allocate …
Run Code Online (Sandbox Code Playgroud) HTTP/1.1 RFC规定"HEAD方法与GET相同,但服务器不得在响应中返回消息体." 我知道Apache尊重RFC,但模块不必.我的问题是,mod_php5是否尊重这一点?
我问的原因是因为我刚刚看到一篇文章说PHP开发人员应该自己检查:
if (stripos($_SERVER['REQUEST_METHOD'], 'HEAD') !== FALSE) {
exit();
}
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索了一下并没多少出现,除了一些人说他们在获得HEAD请求后尝试了一些奇怪的东西,比如mod_rewrite/redirect,以及2002年的一些旧的bug票据声称mod_php默认仍然执行了其余的脚本.所以我只是通过使用PECL :: HTTP来运行快速测试
http_head('http://mysite.com/test-head-request.php');
Run Code Online (Sandbox Code Playgroud)
虽然有:
<?php error_log('REST OF SCRIPT STILL RAN'); ?>
Run Code Online (Sandbox Code Playgroud)
在test-head-request.php中查看脚本的其余部分是否仍然执行,但事实并非如此.
我认为这应该足以解决它,但希望获得更多反馈,并且可能有助于清除那些对此感到疑惑的其他人的困惑.因此,如果有人知道他们的头顶(没有双关语意) - 或者他们用于接收HEAD请求的任何约定,那就太好了.否则,我会稍后查看C源代码并回复我的调查结果.谢谢.
mod-php ×10
php ×10
apache ×5
fastcgi ×2
http ×2
.htaccess ×1
apache2 ×1
cakephp ×1
interpreter ×1
mod-fastcgi ×1
mod-perl ×1
nginx ×1
performance ×1
perl ×1
virtualhost ×1
wordpress ×1
xdebug ×1