从PHP程序内部我想知道执行它的二进制文件的位置.Perl就是$^X为了这个目的.PHP中是否有相同的东西?
这样它可以使用自己执行子PHP进程(而不是硬编码路径或假设"php"是正确的).
UPDATE
我尝试过但不起作用的事情:
$_SERVER['_']看起来像我想要的命令行,但它实际上来自上一个执行程序的shell设置的环境变量.从Web服务器运行时,这是Web服务器二进制文件.which php将无法正常工作,因为不保证PHP二进制文件与Web服务器中的二进制文件相同PATH.提前致谢.
我是django的新手.我尝试了这个,但我无法部署.我能怎么做
#!/usr/bin/python
import sys
import os
base = os.path.dirname(os.path.abspath(__file__)) + '/..'
sys.path.append(base)
os.environ['DJANGO_SETTINGS_MODULE'] = 'myfirstapp.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Run Code Online (Sandbox Code Playgroud)
AddHandler fcgid-script .fcgi
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^(media/.*)$ - [L]
RewriteRule ^(adminmedia/.*)$ - [L]
RewriteCond %{REQUEST_URI} !(cgi-bin/myproject.fcgi)
RewriteRule ^(.*)$ mysite.fcgi/$1 [L]
Run Code Online (Sandbox Code Playgroud) 我已经安装了PHP来使用IIS6(使用FastCGI).我能够通过以下代码查看显示PHP信息的示例测试网站:
<?php phpinfo(); ?>
现在这个工作我尝试将我的PHP网站迁移到IIS6,这里是我得到的错误/警告的列表:
PHP Warning: session_start(): open(C:\WINDOWS\Temp\sess_rjbv0ialf7uf03to69q1e4l101, O_RDWR) failed: Permission denied (13) in C:\Site\index.php on line 11
PHP Warning: Unknown: open(C:\WINDOWS\Temp\sess_rjbv0ialf7uf03to69q1e4l101, O_RDWR) failed: Permission denied (13) in Unknown on line 0
PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (C:\WINDOWS\Temp) in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)
看到这个后,我更正了php.ini文件以正确设置会话保存值:
session.save_path="C:\WINDOWS\Temp"
Run Code Online (Sandbox Code Playgroud)
然而,这样做没有做任何事!我怎样才能使它工作?
编辑:更新 - 向下滚动
编辑2:更新 - 问题解决了
我正在用Java编写我自己的网络服务器,几天前我问过Apache如何与PHP接口,所以我可以实现PHP支持.我了解到FastCGI是最好的方法(因为mod_php不是一个选项).所以我查看了FastCGI协议规范,并设法为我的服务器编写了一个可用的FastCGI包装器.我已经测试了phpinfo()并且它可以工作,实际上所有的PHP函数似乎都运行得很好(发布数据,会话,日期/时间等等).
我的网络服务器能够同时处理请求(即user1可以在user2请求some_large_binary_file.zip的同时检索file1.html),它通过为每个用户请求生成一个新的Java线程(在完成或用户与客户端的连接时终止)来完成此操作取消).
但是,它不能同时处理2个(或更多)FastCGI请求.它的作用是,它将它们排队,所以当请求1立即完成后,它开始处理请求2.我用2个PHP页面测试了它,一个包含sleep(10),另一个包含phpinfo().
我将如何处理多个请求,因为我知道它可以完成(IIS下的PHP运行为FastCGI,它可以处理多个请求就好了).
更多信息:
我在windows下编码,我用于执行php-cgi.exe的批处理文件包含:
set PHP_FCGI_CHILDREN=8
set PHP_FCGI_MAX_REQUESTS=500
php-cgi.exe -b 9000
Run Code Online (Sandbox Code Playgroud)
但它不会产生8个孩子,该服务只是在500个请求后终止.
我从维基百科做过研究:
通过使用具有内部多路复用的单个连接(即,通过单个连接的多个请求)和/或通过使用多个连接来实现同时处理多个请求
现在很明显,多个连接对我来说不起作用,因为每次客户端请求涉及FastCGI的内容时,它都会为FastCGI应用程序创建一个新的套接字,但它并不能同时工作(而是将它们排队等).
我知道在相同连接下对FastCGI请求进行内部多路复用是通过发出具有不同请求ID的每个唯一FastCGI请求来完成的.(另见的"通信协议"标题中的最后3段这篇文章).
我没有对此进行过测试,但我将如何实现呢?我认为我需要某种FastCGI Java线程,它包含某种类型的Map和一个静态函数,我可以使用它来添加请求.然后在Thread的run()函数中它将有一个while循环,并且对于每个循环,它将检查Map是否包含新请求,如果是,它将为它们分配请求ID并将它们写入FastCGI流.然后等待输入等等,你可以看到这变得太复杂了.
有谁知道这样做的正确方法?还是有任何想法?非常感谢.
注意,如果需要,我可以提供我的FastCGI包装器的代码.
更新:
基本上,我下载了nginx并将其设置为使用PHP作为FastCGI应用程序,它也遇到了与我的服务器相同的问题.它无法处理并发的PHP请求.这让我相信我的代码实际上是正确的.所以PHP出了问题,或者我没有正确设置它.也许是因为我使用的是Windows,因为一些lighttpd用户声称Windows无法正常处理FastCGI(这没有多大意义).我将很快安装Linux并报告任何进展.
我想要一个Web服务器(nginx)和2个与后端相同的应用程序的FastCGI实例.如果第一个请求失败,我们的想法就是将请求转发给第二个请求.
显然,我需要使用upstream和fastcgi_next_upstream.但我找不到nginx.conf文件的工作示例.有没有人有这样的例子?
我整天都在处理这个问题,这让我疯了.所有Google搜索结果和搜索都会导致死胡同.我希望有人能与我合作,为自己和未来的受害者提供解决方案.开始了.
我正在运行一个非常受欢迎的网站,每天有超过3M的页面浏览量.平均每秒34次页面浏览量,但更实际的是,在高峰时段,每秒页面浏览量超过300次.将这些视为请求.
我正在运行一个带有2个E5620 CPU,12GB RAM和一个Micron P300 6Gb/s SSD的Ubuntu 10.04 64位服务器.在高峰时段,CPU和内存负载是平均的(CPU使用20-30%,使用一半内存).
支持该站点的软件是:NGINX,MySQL,PHP5-FPM,PHP-APC和Memcached.好的,现在终于帖子的内容,这里是我的错误日志.记录了一堆这些错误.
在/ var /日志/ PHP5-FPM
7月20日14:49:47.289895 [通知] fpm正在运行,pid 29373
7月20日14:49:47.337092 [注意]准备处理连接
7月20日14:51:23.957504 [错误] [池www]无法检索一个或多个子(ren)的进程活动.稍后再试.
7月20日14:51:1.846439 [警告] [池www]子29534从开始114.518174秒后退出代码1
7月20日14:51:41.846797 [注意] [池www]孩子29597开始了
7月20日14:51:41.896653 [警告] [池www]孩子29408在信号11 SIGSEGV退出后114.596706秒开始
7月20日14:51:41.897178 [通知] [池www]孩子29598开始了
7月20日14:51:1.903286 [警告] [池www]子29398从开始114.605761秒后退出代码1
7月20日14:51:41.903719 [通知] [池www]孩子29600开始了
7月20日14:51:41.907816 [警告] [池www]孩子29437从开始114.601417秒后退出代码1
7月20日14:51:41.908253 [注意] [池www]孩子29601开始了
7月20日14:51:41.916002 [警告] [池www]孩子29513从开始114.592514秒后退出代码1
7月20日14:51:41.916501 [通知] [池www]孩子29602开始了
7月20日14:51:41.916558 [警告] [池www]孩子29494从信号11 SIGSEGV退出114.597355秒后开始
7月20日14:51:41.916873 [通知] [池www]孩子29603开始了
7月20日14:51:41.921389 [警告] [池www]子29502从开始114.600405秒后退出代码1
/var/log/nginx/error.log 2011/07/20 15:48:42 [错误] 29583#0:*569743 readv()失败(104:通过对等方连接重置)在读取上游时,客户端:77.223.197.193 ,server:domain.com,request:"GET /favicon.ico HTTP/1.1",上游:"fastcgi://127.0.0.1:9000",主持人:"www.domain.com"
2011/07/20 15:48:42 [错误] 29578#0:*571695 readv()失败(104:通过对等方重置连接)在读取上游时,客户端:150.70.64.196,server:domain.com,request:" GET/page …
在我的烧瓶模板文件中,我包含一个css文件(我省略了样板文件),如下所示:
url_for('static', filename='css/bootstrap.css')
这将呈现为/static/css/bootstrap.css(由于前导斜杠)它被解释为domain.com/static/css/boostrap.css.不幸的是,实际的static文件夹位于一个子目录中:domain.com/projects/test/static/
环境细节:
我的fcgi文件位于~/fcgi-bin文件夹中(主机特定我猜):
$ cat ~/fcgi-bin/test.fcgi
#!/usr/bin/env python2.7
import sys
sys.path.insert(0, "/home/abcc/html/projects/test")
from flup.server.fcgi import WSGIServer
from app import app
class ScriptNameStripper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = ''
return self.app(environ, start_response)
app = ScriptNameStripper(app)
if __name__ == '__main__':
WSGIServer(app).run()
Run Code Online (Sandbox Code Playgroud)
和我的.htaccess位于domain.com/projects/test/
$ cat .htaccess
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
<Files ~ (\.fcgi)>
SetHandler fcgid-script
Options +FollowSymLinks +ExecCGI
</Files>
</IfModule>
<IfModule mod_rewrite.c>
Options …Run Code Online (Sandbox Code Playgroud) 我正在尝试覆盖使用fastcgi_pass时传递给基于php的应用程序(特别是Phabricator)的http主机头.
我在使用proxy_pass时发现了很多这样做的例子,但我似乎无法找到如何使用fastcgi_pass执行此操作的示例.具体来说,我希望代理的php应用程序将主机头看作"phabricator.localhost".
(这样做的原因是我想将几个不同的域与Phabricator webapp相关联,但它只允许一个域关联,并且它拒绝任何未创建该域的请求.)
我很擅长用FastCGI配置Nginx,所以我不确定fastcgi的工作原理.任何帮助表示赞赏.
这是我的Nginx服务器配置:
server {
server_name phabricator.localhost www.example.com example.com;
root /opt/phabricator/phabricator/webroot;
location / {
index index.php;
rewrite ^/(.*)$ /index.php?__path__=/$1 last;
}
location = /favicon.ico {
try_files $uri =204;
}
location /index.php {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
#### HERE ARE MY ATTEMPTS #####
#proxy_set_header HOST phabricator.localhost;
#fastcgi_param SERVER_NAME phabricator.localhost;
#fastcgi_pass_header 'Host: phabricator.localhost';
#fastcgi_pass_header 'Host: phabricator.localhost';
#add_header Host phabricator.localhost;
#proxy_set_header Host phabricator.localhost;
#### END ATTEMPTS ####
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD …Run Code Online (Sandbox Code Playgroud) 我继承了一个django + fastcgi应用程序,需要对其进行修改以执行冗长的计算(最多半小时或更长时间).我想要做的是在后台运行计算并返回"你的工作已经开始" - 类型的响应.当进程正在运行时,对URL的进一步命中应返回"您的作业仍在运行",直到作业完成,此时应返回作业的结果.对url的任何后续命中都应该返回缓存的结果.
我是django的一个新手,并且在十年内没有做过任何重要的网络工作,所以我不知道是否有内置的方法来做我想要的.我已经尝试通过subprocess.Popen()启动该过程,并且它工作正常,除了它在进程表中留下一个已解除的条目.我需要一个干净的解决方案,一旦完成就可以删除临时文件和进程的任何痕迹.
我也尝试过fork()和线程,但还没有找到可行的解决方案.对于我来说似乎是一个非常常见的用例,是否有规范的解决方案?FWIW这只会在流量非常低的内部服务器上使用.
我一直在玩微软的Django tutoiral,它在我的Visual Studio 2015环境中使用Python 3.4.3运行良好.当我尝试通过我的网络服务器运行它时,它失败了:
Error occurred:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\wfastcgi.py", line 805, in main
result = handler(record.params, response.start)
File "C:\Python34\lib\site-packages\django\core\handlers\wsgi.py", line 158, in __call__
self.load_middleware()
File "C:\Python34\lib\site-packages\django\core\handlers\base.py", line 51, in load_middleware
mw_class = import_string(middleware_path)
File "C:\Python34\lib\site-packages\django\utils\module_loading.py", line 20, in import_string
module = import_module(module_path)
File "C:\Python34\lib\importlib\__init__.py", line 109, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
File "<frozen …Run Code Online (Sandbox Code Playgroud) fastcgi ×10
php ×5
python ×4
django ×3
nginx ×3
apc ×1
concurrency ×1
flask ×1
hostheader ×1
iis ×1
iis-6 ×1
phabricator ×1
redundancy ×1
session ×1
url-for ×1