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小时内删除。