fastcgi,php 和外部命令的执行(主要是转换)不起作用
fastcgi, php and execution of external commands (convert mostly) not working
自从我使用 apache 2.4 和 php.
切换到 fast-cgi 以来,我正疯狂地试图找出我遇到的问题
我以前 运行 convert
mod_php 没有问题,但自从我切换后,我没有收到任何错误,脚本无法正常工作。
例如,如果我尝试 运行 以下命令在 mod_php 下它有效,在 fast-cgi 下它不起作用:
( ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 /usr/local/bin/convert -limit time 10 -limit memory 512Mb -background transparent "/path_a/1568/15684771/uploaded_as/_web_upload_21fmupicf34eekkuer5cm7hic0.pdf_20160218_56c61b5383271_web_safe.png" -background transparent -interlace PLANE -resize "305x300" -strip +repage -depth 6 -quality 80 /path_b/tmp/cached_images/30/72/li15684771684e24cdc9648c33e9ccc880b0356c8455652d0e697171e627f3b729b90aa4a3.png 2>/dev/null )
现在,使用相同权限访问相同路径的其他命令可以正常工作:
( ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 /usr/local/bin/convert -limit time 10 -limit memory 512Mb -quiet -background transparent "/path_a/1568/15684767/uploaded_as/CC.PNG_20160218_56c61d465e8a3_web_safe.png" -background transparent -interlace PLANE -resize "311x300" -strip +repage -depth 6 -quality 80 /path_b/tmp/cached_images/11/24/li156847675bcf6aa92d8ce5e08b8a0d995fbd59ff590ab3d7cd543a2c1392c803547904f6.png 2>/dev/null )
我认为它与 ulimit
有关,所以我创建了一个简单的 sh 脚本并尝试执行相同的命令,它们都有效。
当我测试它们时,apache 配置之间的区别如下:
#FAST CGI
LoadModule fastcgi_module libexec/apache24/mod_fastcgi.so
LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
#MOD_PHP
LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
LoadModule php5_module libexec/apache24/libphp5.so
我有一个我不更改的特定 apache-php 文件:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule fastcgi_module>
#fast-cgi
FastCgiConfig -maxClassProcesses 100 -maxProcesses 100 -idle-timeout 200
ScriptAlias /cgi-bin/ "/my_path_to/cgi-bin/"
AddHandler php5-fastcgi .php .html
Action php5-fastcgi /cgi-bin/php.cgi
<Location "/cgi-bin/php.cgi">
Order Deny,Allow
Deny from All
Allow from env=REDIRECT_STATUS
Options ExecCGI
SetHandler fastcgi-script
</Location>
</IfModule>
<IfModule php5_module>
#mod-php
AddHandler php5-script .php .html
</IfModule>
最后这是我的 php-cgi 文件:
#!/bin/sh
# Shell Script To Run PHP5 using mod_fastcgi under Apache 2.x
# Tested under FreeBSD 6.x and 7.x
### Set PATH ###
PHP_CGI=/usr/local/bin/php-cgi
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=5000
### no editing below ###
export PHP_FCGI_CHILDREN
export PHP_FCGI_MAX_REQUESTS
#export USE_ZEND_ALLOC=0
exec $PHP_CGI
apache 的 mpm 指令是:
<IfModule mpm_prefork_module>
MaxMemFree 10000
StartServers 100
MinSpareServers 10
MaxSpareServers 50
GracefulShutDownTimeout 2
MaxRequestsPerChild 1000
MaxClients 1000
MaxRequestWorkers 1000
</IfModule>
<IfModule mpm_event_module>
MaxMemFree 10000
StartServers 10
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 1000
MaxConnectionsPerChild 0
GracefulShutDownTimeout 2
MaxClients 1000
</IfModule>
我什至开始遇到问题 运行宁此:
ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 /usr/local/bin/convert -list format | grep -E ' +r[w+-]{2} +' | awk '{print }' | sed 's/\*//g
但如果我 运行 一次 运行 没有问题
ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 /usr/local/bin/convert -list format >file.a
ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 grep -E ' +r[w+-]{2} +' file.a > file.b
ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 awk '{print }' file.b
/*
* here I just simply grab the content and do a str_replace
* it is not permissions on sed as I did it with a 4th line and
* sed but it was a bit of an overkill)
*/
我尝试执行命令:
proc($cmd, 'r');
`$cmd`;
exec($cmd);
etc...
他们都在 mod_php
下与 proc
一起工作
php.ini 将内存限制设置为 256M,以防万一。我试图将它增加到 512M 甚至 1G 只是为了测试这是否是问题所在,但它没有改变。这也不是超时问题,因为通过命令行和 php 脚本
执行不到 1 秒
我明白了!!!
执行路径不同,所以我假设某些库无法被 convert 或其他使用的程序调用和包含。
我更改了我的 php-cgi
文件以包含以下内容:
PATH=$PATH:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH
我当前的php-cgi
文件如下:
#!/bin/sh
# Shell Script To Run PHP5 using mod_fastcgi under Apache 2.x
# Tested under FreeBSD 6.x and 7.x
### Set PATH ###
PHP_CGI=/usr/local/bin/php-cgi
### no editing below ###
PATH=$PATH:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH
export PHP_FCGI_CHILDREN=0
export PHP_FCGI_MAX_REQUESTS=10000
#export USE_ZEND_ALLOC=0
exec $PHP_CGI
现在一切正常。
您可能需要将路径调整为 OS
自从我使用 apache 2.4 和 php.
切换到 fast-cgi 以来,我正疯狂地试图找出我遇到的问题我以前 运行 convert
mod_php 没有问题,但自从我切换后,我没有收到任何错误,脚本无法正常工作。
例如,如果我尝试 运行 以下命令在 mod_php 下它有效,在 fast-cgi 下它不起作用:
( ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 /usr/local/bin/convert -limit time 10 -limit memory 512Mb -background transparent "/path_a/1568/15684771/uploaded_as/_web_upload_21fmupicf34eekkuer5cm7hic0.pdf_20160218_56c61b5383271_web_safe.png" -background transparent -interlace PLANE -resize "305x300" -strip +repage -depth 6 -quality 80 /path_b/tmp/cached_images/30/72/li15684771684e24cdc9648c33e9ccc880b0356c8455652d0e697171e627f3b729b90aa4a3.png 2>/dev/null )
现在,使用相同权限访问相同路径的其他命令可以正常工作:
( ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 /usr/local/bin/convert -limit time 10 -limit memory 512Mb -quiet -background transparent "/path_a/1568/15684767/uploaded_as/CC.PNG_20160218_56c61d465e8a3_web_safe.png" -background transparent -interlace PLANE -resize "311x300" -strip +repage -depth 6 -quality 80 /path_b/tmp/cached_images/11/24/li156847675bcf6aa92d8ce5e08b8a0d995fbd59ff590ab3d7cd543a2c1392c803547904f6.png 2>/dev/null )
我认为它与 ulimit
有关,所以我创建了一个简单的 sh 脚本并尝试执行相同的命令,它们都有效。
当我测试它们时,apache 配置之间的区别如下:
#FAST CGI
LoadModule fastcgi_module libexec/apache24/mod_fastcgi.so
LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
#MOD_PHP
LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
LoadModule php5_module libexec/apache24/libphp5.so
我有一个我不更改的特定 apache-php 文件:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule fastcgi_module>
#fast-cgi
FastCgiConfig -maxClassProcesses 100 -maxProcesses 100 -idle-timeout 200
ScriptAlias /cgi-bin/ "/my_path_to/cgi-bin/"
AddHandler php5-fastcgi .php .html
Action php5-fastcgi /cgi-bin/php.cgi
<Location "/cgi-bin/php.cgi">
Order Deny,Allow
Deny from All
Allow from env=REDIRECT_STATUS
Options ExecCGI
SetHandler fastcgi-script
</Location>
</IfModule>
<IfModule php5_module>
#mod-php
AddHandler php5-script .php .html
</IfModule>
最后这是我的 php-cgi 文件:
#!/bin/sh
# Shell Script To Run PHP5 using mod_fastcgi under Apache 2.x
# Tested under FreeBSD 6.x and 7.x
### Set PATH ###
PHP_CGI=/usr/local/bin/php-cgi
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=5000
### no editing below ###
export PHP_FCGI_CHILDREN
export PHP_FCGI_MAX_REQUESTS
#export USE_ZEND_ALLOC=0
exec $PHP_CGI
apache 的 mpm 指令是:
<IfModule mpm_prefork_module>
MaxMemFree 10000
StartServers 100
MinSpareServers 10
MaxSpareServers 50
GracefulShutDownTimeout 2
MaxRequestsPerChild 1000
MaxClients 1000
MaxRequestWorkers 1000
</IfModule>
<IfModule mpm_event_module>
MaxMemFree 10000
StartServers 10
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 1000
MaxConnectionsPerChild 0
GracefulShutDownTimeout 2
MaxClients 1000
</IfModule>
我什至开始遇到问题 运行宁此:
ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 /usr/local/bin/convert -list format | grep -E ' +r[w+-]{2} +' | awk '{print }' | sed 's/\*//g
但如果我 运行 一次 运行 没有问题
ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 /usr/local/bin/convert -list format >file.a
ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 grep -E ' +r[w+-]{2} +' file.a > file.b
ulimit -u 500 ; ulimit -m 307200 ; ulimit -v 614400 ; ulimit -f 307200 ; ulimit -t 30 ; nice -n 10 awk '{print }' file.b
/*
* here I just simply grab the content and do a str_replace
* it is not permissions on sed as I did it with a 4th line and
* sed but it was a bit of an overkill)
*/
我尝试执行命令:
proc($cmd, 'r');
`$cmd`;
exec($cmd);
etc...
他们都在 mod_php
proc
一起工作
php.ini 将内存限制设置为 256M,以防万一。我试图将它增加到 512M 甚至 1G 只是为了测试这是否是问题所在,但它没有改变。这也不是超时问题,因为通过命令行和 php 脚本
执行不到 1 秒我明白了!!! 执行路径不同,所以我假设某些库无法被 convert 或其他使用的程序调用和包含。
我更改了我的 php-cgi
文件以包含以下内容:
PATH=$PATH:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH
我当前的php-cgi
文件如下:
#!/bin/sh
# Shell Script To Run PHP5 using mod_fastcgi under Apache 2.x
# Tested under FreeBSD 6.x and 7.x
### Set PATH ###
PHP_CGI=/usr/local/bin/php-cgi
### no editing below ###
PATH=$PATH:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH
export PHP_FCGI_CHILDREN=0
export PHP_FCGI_MAX_REQUESTS=10000
#export USE_ZEND_ALLOC=0
exec $PHP_CGI
现在一切正常。
您可能需要将路径调整为 OS