PHP 主要用在三个领域
网站和 web 应用程序(服务器端脚本)
命令行脚本
桌面(GUI)应用程序
有两个方法将 PHP 连接到服务器上SAPI、ISAPI方式和CGI、FastCGI方式。
对于很多服务器,PHP 均有一个直接的模块接口(也叫做 SAPI)。这些服务器包括 Apache、Microsoft Internet Information Server、Netscape 和 iPlanet 等服务器。其它很多服务器支持 ISAPI,即微软的模块接口(OmniHTTPd 就是个例子)。如果 PHP 不能作为模块支持 web 服务器,总是可以将其作为 CGI 或 FastCGI 处理器来使用。这意味着可以使用 PHP 的 CGI 可执行程序来处理所有服务器上的 PHP 文件请求。
apache可以使用SAPI的方式,作为模块调用PHP,apahce对于FastCGI的方式支持效率不如模块化的方式高。
nginx只能通过FastCGI的方式来调用PHP,调用CGI的效率比apche高不少。可以让PHP和nginx不必装在一台服务器上,让nginx只访问静态文件,而解析PHP文件的工作由另一台CGI服务器来完成。
nginx的安装在windows下或者linux下,应该都不是问题,但是需要注意的是,apache支持静态编译和动态加载的模块调用方式,而nginx只能使用静态编译的方式加载模块。
编译Nginx有些模块是必需的,有些模块是默认的,有些需要编译时指定的,可以参考:Nginx模块参考手册中文版
模块里的指令和变量如apache一样可以再配置文件中使用。
关于配置文件,这将是重点,如下是我的配置文件,有虚拟主机,有CGI,有rewrite。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include pes;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 60;
#gzip on;
autoindex on;
index index.html index.htm index.php;
root d:/www;
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log logs/host.access.log main;
location / {
allow all;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
f;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location ~ \.php$ {
# proxy_pass 127.0.0.1;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
server {
listen *:80;
server_name card360;
root D:/www/v360card/src/www;
#rewrite ^/(.*\.(js|ico|gif|jpg|png|css|php|xml|txt))$ /$1 break;
#rewrite ^/.*$ /index.php break;
nginx停止命令if ($request_filename !~* "^(.*\.(js|ico|gif|jpg|png|css|php|xml|txt))$") {
rewrite ^/.*$ /index.php break;
}
location / {
index index.html index.htm index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include f;
fastcgi_param SCRIPT_NAME $request_uri;
#fastcgi_param PROJECT_INCLUDE_PATH "./;D:/www;D:/www/v360card/config;D:/www/v360card";
}
}
#负载均衡配置
# upstream backend {
# ample weight=5;
# server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
# server unix:/tmp/backend3;
# }
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
下面就是Nginx服务和FastCGI服务的启动和关闭。linux下可以用PHP-FPM来管理FastCGI,但windows下好像不支持这个,可以通过一个简单bat来实现。
@echo off
rem color 0a
rem 停止PHP(FastCGI)进程......
rem taskkill /f /
->nul
< -
echo PHP-FastCGI已停止。
rem 启动PHP(FastCGI)进程......
< -b 127.0.0.1:9000
echo FastCGI已启动。
rem 停止Nginx进程......
< -
echo Nginx 已停止。
rem -v 显示 nginx 的版本。v字有大小之分
-v
rem nginx 将检查指定的配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
< -t -c f
rem 启动Nginx进程......
-c f
echo Nginx已启动。
pause
exit
上面涉
及到两个非win自带的命令,一个用来控制win的进程,关闭,退出,提高优先级等等操作,一个是,用来运行一个命令,并隐藏掉窗口。
之前在apache下可以直接在虚拟主机设置中设置代码php_value include_path,就可以修改PHP的include_path值。
<VirtualHost *:80>
DocumentRoot "D:/www/src/www"
ServerName vmoneyadmin
ErrorLog "logs/vmoneyadmin-error.log"
LogLevel warn
CustomLog "logs/vmoneyadmin-access.log" common
RewriteEngine On
RewriteRule !^/(script|style)?(.*)\.(js|ico|gif|jpg|png|css|php|xml|txt)$ /index.php
php_value include_path "D:/www;D:/www/vmoneyadmin/config/server;./;D:/www/vmoneyadmin"
</VirtualHost>
但是当我在Nginx下想再次寻这种类似的设置时,却没有到。最后只能通过下面的方式勉强为之:首先在设置里面添加一个PROJECT_INCLUDE_PATH,将我们想要的值,传给PHP的$_SERVER超全局变量,然后在程序代码中使用set_include_path($_SERVER['PROJECT_INCLUDE_PATH']);,其实这样也就没有必要非写到Nginx配置文件中了。
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include f;
fastcgi_param SCRIPT_NAME $request_uri;
fastcgi_param PROJECT_INCLUDE_PATH "./;D:/www;D:/www/v360card/config;D:/www/v360card";
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论