HTML5 WebSockets 基础使用学习教程

HTML5 WebSockets简介
WebSockets的使用

HTML5
WebSockets,可替代AJAX,无需AJAX请求即可与服务器端对话。

下面介绍HTML5 WebSockets,和记录Php环境的服务器端运行 WebSocket,创建客户端并通过WebSockets协议发送和接收服务器端信息。


HTML5 WebSockets简介

引用wiki的一句话:WebSocket protocol 是HTML5一种新的协议(protocol)。它是实现了浏览器与服务器全双工通信(full-duplex)(
全双工
:允许两台设备间进行资料的双向传输)

先前,很多网站为了实现即时通讯(real-time),所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(time interval)(如每1秒),由浏览器对伺服器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求(request),然而HTTP request 的header是非常长的,我们需要的数据可能是里面包含的数据的一个很小的值,这样会占用很多的带宽。

而最新的实现轮询效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求(reuqest)。

这时,HTML5 WebSockets的优势就体现出来了。

在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此 WebSocket 协议中,为我们带来了两大好处:

1. Header

互相沟通的Header是很小的-大概只有 2 Bytes

2. Server Push

服务器可以主动传送数据给客户端


WebSockets的使用


类似使用可以参见:《服务器推技术简介及php实现服务器推技术的聊天室

另外关于通过WebSockets协议发送和接收服务器端信息,参见我的另外文章:

php WebSockets服务端和客户端

源码下载使用测试

通过这边文章对WebSockets基础的学习和WebSockets的服务端和客户端代码的使用,对php和HTML5 的WebSockets的使用有了初步掌握。。

PayPal支付接口的PHP开发方式

 

解析PayPal支付接口的PHP开发方式

大家都知道PHP代码的便捷之处和用法,那么今天我们就向大家详细的讲解如何运用PHP来开发PayPal支付接口的相关内容,希望对大家有所帮 助。PayPal 快速、安全而又方便,是跨国交易的首选在线付款方式。现在PayPal支付接口可以和国内大部分信用卡关联,可以实现国人的跨国交易收支。

所谓paypal ipn(Instant Payment Notification),就是Paypal开发的一种能主动通知第三方卖家系统交易状态的一种机制。IPN的原理很简单,就是当产生了一个交易之后, 交易状态发生变化时,如用户已经付款、或者退款、撤销时,Paypal利用常用的HTTP POST方式,将交易的一些变量提交给网站的某个页面(称之为IPN Handler),当这个页面接受到请求时候,将这些数据原封不动加上一个指示验证的cmd=_notify-validate,POST回Paypal 的接口地址,如果数据正确,那么Paypal返回字符串VERIFIED,否则为INVALID,如果结果为VERIFIED,那么你的程序就可以使用这 些数据进行操作。

开设Sandbox帐号

但代码的调试是一件很痛苦的事情,因为作为第三方开发人员,不可能开两个帐号,每次测试还要之间交易一些钱,所以Paypal专门开发了 Sandbox给 开发人员进行开发,首先到https://developer.paypal.com/注册一个开发帐号,好了之后再进入Sandbox建立测试用的 Paypal虚拟帐号(至少应该建立一个Business的和一个Personal的),这 种账号注册方法和Paypal的流程一样,信息可以是假的,包括银行帐号、信用卡(其实Paypal Sandbox会自动生成一些随机的号码)。接下来需要激活Paypal Sandbox的虚拟帐号,注意,这里不管你在Paypal Sanbox注册时填什么邮件地址,有任何发送到虚拟帐号所填邮箱的邮件都存会在开发帐号的管理界面中的Email页(导航栏上有)中。登录 Sandbox的虚拟Paypal环境,还需要验证虚拟帐号的银行,这里可以随便填,然后通过Add Funds来给账户充值(想填多少填多少 920-203 920-533 )。然后,还需要激活IPN的选项,在Business的那个账户的Profile设置页面中,点击,然后点击Edit按钮,打开IPN,这里如果你使用 的是固定的IPN Handle,可以直接将地址填入。

接下来,我们测试的时候,应该将Paypal接口的地址设置为https://www.sandbox.paypal.com/cgi-bin /webscr

基本的流程

当客户向您付款时,PayPal将向位于指定 URL (type=”hidden” name=”notify_url” value=” “)的服务器发送一个通知。此通知中将包括您的客户的所有付款信息(例如,客户名称、金额),以及一段加密代码。当服务器收到通知时,它随后会将该信息 (包括加密代码)发送回安全的PayPal URL。PayPal将通过检查加密字符串对交易进行身份验证。这种将 IPN 数据传回PayPal的操作防止了“欺骗”,因此您可以确保 IPN 来自PayPal。在进行验证时,PayPal会将其合法性的确认信息发送回您的服务器。

提示:要启用即时付款通知,您将需要输入一个 URL,通过它您可以接收到来自您的用户信息的通知。

启用了即时付款通知后,每次当您接收付款时您的服务器都会收到一个通知,此通知将以隐藏的“FORM POST”的方式发送到指定的 URL,并将包括所有付款信息。此页面的底部列出了通知的 FORM 变量。

每次收到来自PayPal的 IPN 时,您必须在实施订单之前完成如下所述的通知确认过程。确认列出的信息将可确保交易合法。

通知确认IPN

为了确保付款已进入您的PayPal账户,您必须验证用作“receiver_email”的电子邮件地址是否已在您的PayPal账户中注册并得 到确认。

服务器收到即时付款通知后,您将需要通过构建一个发送到PayPal的 HTTP POST 对其进行确认。您的 POST 应发送到https://www.paypal.com/cgi-bin/webscr

您必须完全按照收到表单变量时的原样发送所有收到的表单变量。您还需要将一个值为“_notify-validate”的名为“cmd”变量(例 如,cmd=_notify-validate)附加到 POST 字符串。

PayPal将回复该 POST,并在回复的正文中包含一个单词“VERIFIED”或“INVALID”。当您收到 VERIFIED 回复时,您需要在实施订单之前执行若干检查:

确认“payment_status”为“Completed”,因为系统也会为其他结果(如“Pending”或“Failed”)发送 IPN。

检查“txn_id”是否未重复,以防止欺诈者重复使用旧的已完成的交易。

验证“receiver_email”是已在您的PayPal账户中注册的电子邮件地址,以防止将付款发送到欺诈者的账户 。

检查其他交易详情(如物品号和价格),以确认价格未改变完成了以上检查后,您可以使用 IPN 数据更新您的数据库,并处理购物。

如果收到“无效”通知,则应将其视为可疑通知,并应对其进行调查。

主要参数:

向PayPal提交粘贴代码时,应包括以下 4 个隐藏变量及一张图片,这就是说,您粘贴到PayPal的最短必需代码应如下:

 <form action="https://www.paypal.com/row/cgi-bin/webscr" method="post">
 <input type="hidden" name="cmd" value="_xclick">  // "_xclick" 立即购买
 <input type="hidden" name="business" value="you@youremail.com">   //PayPal账户上的电子邮件地址
 <input type="hidden" name="item_name" value="Item Name"> //物品名称(或购物车名称)
 <input type="hidden" name="currency_code" value="USD"> //定义币种以标示货币变量 值可以为 "USD"、"EUR"、"GBP"、"CAD"、"JPY"。
 <input type="hidden" name="amount" value="0.00"> //物品的价格(购物车中所有物品的总价格,因为是_Xclick模式)
<input type="image" src="http://www.paypal.com/zh_XC/i/btn/x-click-but01. gif" name="submit" alt="请使用PayPal付款!">
 </form>

可用变量

business 您的PayPal账户上的电子邮件地址

quantity 物品数量。大于 1 时,会与金额相乘

item_name 物品名称(或购物车名称)。必须是字母数字字符,最多为 127 个字符

item_number 用于跟踪付款的可选传递变量。必须是字母数字字符,最多为 127 个字符

amount 物品的价格(购物车中所有物品的总价格)

shipping 该物品的运送成本

shipping2 每增加一件物品所需的运送成本

handling 手续费

tax 基于交易的税额。如果使用该变量,传递值将覆盖所有用户信息税收设置(不管买家所在位置)。

no_shipping 送货地址。如果设为 “1″,则不会要求您的客户提供送货地址。该变量为可选项;如果省略或设为 “0″,将提示您的客户输入送货地址

cn 可选标签,会在提示栏上显示(最多 40 个字符)

no_note 为付款加入提示。如果设为 “1″,则不会提示您的客户输入提示。该变量为可选项;如果省略或设为 “0″,将提示您的客户输入提示。

on0 第一选项栏名称。最多 64 个字符

os0 第一组选项值。最多 200 个字符。”on0″ 必须定义,以便识别 “os0″。

on1 第二选项栏名称。最多 64 个字符

os1 第二组选项值。最多 200 个字符。”on1″ 必须定义,以便识别 “os1″。

custom 决不会向您的客户显示的可选转递变量。可用于跟踪存货

invoice 决不会向您的客户显示的可选转递变量。可用于跟踪账单号

notify_url 仅与 IPN 一起使用。发送 IPN Form Post 的互联网 URL

return 您的客户完成付款后将返回的互联网 URL

cancel_return 您的客户取消付款后将返回的互联网 URL

image_url 您要用作图标的图片的互联网 URL,图片大小为 150 X 50 像素

cs 设置您的付款页面的背景色。如果设为 “1″,背景色将为黑色。该变量为可选项;如果省略或设为 “0″,背景色将为白色

扩展变量

PayPal 允许您粘贴扩展变量,条件是将改变以下 “cmd” 值:

到:

通过上述 “cmd” 值修改,您还可使用以下变量:

扩展变量

email 客户的电子邮件地址

first_name 客户的名。必须是字母数字字符,最多为 32 个字符

last_name 客户的姓。必须是字母数字字符,最多为 64 个字符

address1 客户地址所在国家或地区。必须是字母数字字符,最多为 100 个字符

address2 客户地址第二行。必须是字母数字字符,最多为 100 个字符

city 客户地址所在城市。必须是字母数字字符,最多为 100 个字符

state 客户地址所在州。必须是正式的 2 个字母缩写

zip 客户地址的邮政编码

night_phone_a 客户夜间联系电话号码的区号

night_phone_b 客户夜间联系电话号码前三位

day_phone_a 客户白天联系电话号码的区号

day_phone_b 客户白天联系电话号码前三位

提示:若要更改”用户信息”中的默认运费和手续费设置,请转至您的用户信息,编辑您的运费计算,然后点击”允许采用基于交易的运费”复选框。

将单个物品传递给PayPal

如果您的第三方购物车可设置成向PayPal传递单个物品,有关物品的信息将加入买家和卖家的记录日志和系统通知中。要加入该物品的信息,您需要将 HTML 格式元素粘贴至PayPal购物车流程的新版本。该过程与 #1 节”将总购物车数量传递给PayPal”描述的非常相似,不同之处在于:

将 “cmd” 变量设置到 “_cart”

更换必要的 HTML 行

添加称为 “upload” 的新变量

在 <表格> 和 标签之间新增以下行:

定义物品明细

对于以下各特定物品参数,定义与通过您的合作商购物车购买的各物品对应的一组新值。将 “_x” 附加到变量名称,其中 x 是物品号码,从 1 开始,每加入一物品增加一。

item_name_x (物品 #x 需要)购物车中物品 #x 的名称。必须是字母数字字符,最多为 127 个字符

item_number_x 与购物车中物品 #x 关联的可选传递变量。必须是字母数字字符,最多为 127 个字符

amount_x (物品 #x 需要)物品 #x 的价格

shipping_x 运送物品 #x 的第一件(数量 1)的成本

shipping2_x 每增加一件运送物品 #x(数量 2 或更多)所需的运送成本

handling_x 物品 #x 的处理成本

on0_x 物品 #x 的第一选项栏名称。最多 64 个字符

os0_x 物品 #x 的第一组选项值。最多 200 个字符。”on0_x” 必须定义,以便识别 “os0_x”。

on1_x 物品 #x 的第二选项栏名称。最多 64 个字符

os1_x 物品 #x 的第二组选项值。最多 200 个字符。”on1_x” 必须定义,以便识别 “os1_x”。

为购物车中每件物品重复此设定

为您的买家购物车中的各物品加入以上表格中的一组必需的变量和任何选项变量。购物车中的第一物品必须用以 “_1″ 结束的参数定义,如 “item_name_1″、”amount_1″ 等。同样,第二物品应用变量 “item_name_2″、”amount_2″ 等命名。提示:”_x” 值必须以一为单位按序递增,以便识别。如果从 item #1 跳到 item #3 而不定义 item #2,则第三个物品会被忽略。

要指定币种:所有货币变量(金额、运费、运费 2、手续费、税款)将以粘贴在付款上的 “currency_code” 变量指定的币种显示。因为其不是随物品不同的,无需向变量名称附加 “_x”。如果没有粘贴 “currency_code” 变量,我们将假定所有货币变量值为美元。.

电子商务系统使用paypal支付接口的程序流程及通信接口

magento使用paypal支付接口测试

服务器重启或mysql重启后导致magento出现表被破坏的报错问题

 

 重启服务器后或重启mysql后有时候会发现,magento做的网站打开时出现数据库表损坏的错误提示,如:

SQLSTATE[HY000]: General error: 145 Table ‘./abc /log_visitor’ is marked as crashed and should be repaired

Trace: 
#0 /shares/websites/xxxxxxx.com/lib/Zend/Db/Statement.php(283): Zend_Db_Statement_Pdo->_execute(Array) 
#1 /shares/websites/www.supercamper.co.uk/lib/Zend/Db/Adapter/Abstract.php(406): Zend_Db_Statement->execute(Array) 
#2 /shares/websites/www.supercamper.co.uk/lib/Zend/Db/Adapter/Pdo/Abstract.php(206): Zend_Db_Adapter_Abstract->query(’INSERT INTO `lo...’, Array) 
#3 /shares/websites/www.supercamper.co.uk/lib/Zend/Db/Adapter/Abstract.php(484): Zend_Db_Adapter_Pdo_Abstract->query(’INSERT INTO `lo...’, Array) 
#4 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Core/Model/Mysql4/Abstract.php(343): Zend_Db_Adapter_Abstract->insert(’log_visitor’, Array) 
#5 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Core/Model/Abstract.php(235): Mage_Core_Model_Mysql4_Abstract->save(Object(Mage_Log_Model_Visitor)) 
#6 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Log/Model/Visitor.php(136): Mage_Core_Model_Abstract->save() 
#7 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Core/Model/App.php(1032): Mage_Log_Model_Visitor->initByRequest(Object(Varien_Event_Observer)) 
#8 /shares/websites/www.supercamper.co.uk/app/Mage.php(278): Mage_Core_Model_App->dispatchEvent(’controller_acti...’, Array) 
#9 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Core/Controller/Varien/Action.php(377): Mage::dispatchEvent(’controller_acti...’, Array) 
#10 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Core/Controller/Front/Action.php(40): Mage_Core_Controller_Varien_Action->preDispatch() 
#11 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Core/Controller/Varien/Action.php(335): Mage_Core_Controller_Front_Action->preDispatch() 
#12 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(159): Mage_Core_Controller_Varien_Action->dispatch(’index’) 
#13 /shares/websites/www.supercamper.co.uk/app/code/core/Mage/Core/Controller/Varien/Front.php(146): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http)) 
#14 /shares/websites/www.supercamper.co.uk/app/Mage.php(427): Mage_Core_Controller_Varien_Front->dispatch() 
#15 /shares/websites/www.supercamper.co.uk/index.php(40): Mage::run(’default’) 
#16 {main}

进入mysql数据库的数据目录,通常是/var/lib/mysql,如果你不确定,或者此目录不存在,你可以通过查看mysql的配置文件或其它方式来获取.

然后执行下面的命令修复mysql被破环的表

myisamchk -r *.MYI

即可修复好magento数据库中由于mysql服务器重启破坏的表结构.

linux远程拷贝下载文件 - ftp命令和scp命令

ftp命令:

 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载。

 1. 连接ftp服务器
  格式:ftp [hostname| ip-address]
  a)在linux命令行下输入:ftp 192.168.26.66
  b)服务器询问你用户名和口令,分别输入用户名和相应密码,待认证通过即可。

 2. 下载文件

  下载文件通常用get和mget这两条命令。
  a) get
  格式:get [remote-file] [local-file]
  将文件从远端主机中传送至本地主机中.
  如要获取服务器上e:\rose\1.bmp,则
  ftp> get /rose/1.bmp 1.bmp (回车)

  b) mget      
  格式:mget [remote-files]
  从远端主机接收一批文件至本地主机.
  如要获取服务器上e:\rose\下的所有文件,则
  ftp> cd /rose
  ftp> mget *.* (回车)

  注意:文件都下载到了linux主机的当前目录下。比如,在 /root/yint下运行的ftp命令,则文件都下载到了/root/yint 下。

 3.上传文件

  a) put
  格式:put local-file [remote-file]
  将本地一个文件传送至远端主机中.
  如要把本地的1.bmp传送到远端主机e:\rose,并改名为333.bmp
  ftp> put 1.bmp /rose/333.bmp (回车)

  b) mput
  格式:mput local-files
  将本地主机中一批文件传送至远端主机.
  如要把本地当前目录下所有bmp文件上传到服务器e:\rose 下
  ftp> cd /rose (回车)
  ftp> mput *.bmp (回车)
  注意:上传文件都来自于主机的当前目录下。比如,在 /root/test下运行的ftp命令,则只有在/root/test下的文件linux才会 上传到服务器e:\rose 下。

 4. 断开连接
  bye:中断与服务器的连接。
  ftp> bye (回车)

SCP命令:

    scp是安全的文件拷贝,基于ssh的登录

   假定你想把本地计算机/home下的一个名为a.tar.tz的文件拷贝到远程服务器192.168.0.2上的/home/tmp。而且你在远程服务器 上的帐号名为root。可以用这个命令:
scp /home/a.tar.tz root@192.168.0.2:/home/tmp/

如果把文件从远程机器拷贝到本机当前目录用这个命令:
   scp root@192.168.0.2:/home/a.tar.tz

   拷贝远程机器的整个目录下的文件
   scp -r root@192.168.0.2:/home/* ./

又一篇关于PHP性能优化的文章

1、升级硬件的一般规则:对于 PHP 脚本而言,主要的瓶颈是 CPU ,对于静态页面而言,瓶颈是内存和网络。一台 400 Mhz 的普通奔腾机器所下载的静态页面就能让 T3 专线(45Mbps)饱和。

2、Apache 处理 PHP 脚本的速度要比静态页面慢 2-10 倍,因此尽量采用多的静态页面,少的脚本。

3、PHP 脚本如果不做缓冲,每次调用都需要编译,因此,安装一个 PHP 缓冲产品能提升 25-100% 的性能。

4、把基于文件的会话切换到基于共享内存的会话。编译 PHP 时采用 --with-mm 选项,在 php.ini 中设置 set session.save_handler=mm 。这个简单的修改能让会话管理时间缩短一半。

5、另外一项缓冲技术是把不常修改的 PHP 页面采用 HTML 缓冲输出。

6、如果你采用了 Linux 系统,建议升级内核到 2.6.0以上(现在最新版本为2.6.10)并开启抢占式内核支持,因为静态页面由内核服务。

7、采用最新版本的 Apache ,并把 PHP 编译其中,或者采用 DSO 模式,尽量不要采用 CGI 方式。

8、采用输出缓冲(请参考ob_start),如果你的代码有很多的 print 和 echo 语句,能提速 5-15% 。

9、不要在 Web 服务器上运行 X-Windows ,关掉没有必要运行的进程,如果已经安装了X-windows,请使用 init 3退出。

10、如果能够用文本就不要用图像,尽量减小图片的尺寸。

11、分散负载,把数据库服务器放到另外的机器上去。采用另外低端的机器服务图片和 HTML 页面,如果所有的静态页面在另外一台服务器上处理,可以设置 httpd.conf 中的 KeepAlives 为 off ,来减少断开连接的时间。

12、采用 hdparm 来优化磁盘,一般能提升 IDE 磁盘读写性能 200%,但是对 SCSI 硬盘没有效果。

13、修改 httpd.conf :
# 关闭 DNS lookups,PHP 脚本只拿 IP 地址
HostnameLookups off

# 关闭 htaccess 检测

AllowOverride none



打开 FollowSymLinks ,关闭 SymLinksIfOwnerMatch 以防 lstat() 系统调用:
Options FollowSymLinks
#Options SymLinksIfOwnerMatch
下面还有很多关于 httpd.conf 参数的调整。

14、Kurt 简洁而完整的 Apache Tuning Tips

15、如果喜欢从修改 Apache 源码入手,可以安装 lingerd。 在页面产生和发送后,每个 Apache 进程都会浪费一段时光在客户连接上,Lingerd 能接管这项工作,让 Apache 迅速服务下一个客户请求。

16、如果网络拥挤,CPU 资源不够用,采用 PHP 的 HTML 压缩功能:
output_handler = ob_gzhandler
PHP 4.0.4 及以前的用户请不要使用,因为存在内存泄漏问题。

17、修改 httpd.conf 中的 SendBufferSize 为你最大的页面文件的大小。加大内核的 TCP/IP 写缓冲大小

18、另外一篇文章:Tuning Apache Web Servers for Speed,一篇 97 年的很古老的文章。

19、采用数据库的持久连接时,不要把 MaxRequestsPerChild 设置得太大。

20、Caching Tutorial for Web Authors and Webmasters教你怎样实现浏览器缓冲。

21、如果你足够勇敢的话,还可以采用 Silicon Graphics 的 Accelerated Apache补 丁。这个工程能使 Apache 1.3 快 10 倍,使 Apache 2.0 快 4 倍。

22、来自Professional Apache的技巧。

23、官方的Performance Tuning文档,很好的资料,但是十分繁琐。

24、编译 PHP 时,建议采用如下的参数:
--enable-inline-optimization --disable-debug

25、安装mod_gzip(apache1.3)或者mod_deflate(apache2.0)等页面压缩软件减轻服务器拥堵。同时尽可能优化你的 HTML文件和PHP文件。

26、优化 Linux ,more Linux 以及Solaris。

27、如果系统瓶颈在MYSQL的数据操作上,可以考虑将Mysql拆分成多个端口甚至多个服务器并适当优化my.cnf ,这比使用单个端口速度提高不少。

26、以上所有的方法都是针对单机而言的,如果你觉得系统还是不够快,可以采用集群,负载均衡,缓冲技术。采用 Squid 作为缓冲,配置 Squid 的方法。

关于PHP CGI和CLI的几点学习

 

本文来自小屋
sjolzy.cn【原创】

 

首先关于几个概念词的总结:

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CGI
:“公共网关接口”(Common Gateway Interface),HTTP服务器
与你的或其它机器上的程序
进行
“交谈”的一种工具
,其程序
须运行在网络
服务器
上。在服务器
环境中,为“程序
”提供标准
的接口,通过这个接口,“程序
”可以对服务器
客户端
交换的信息
做一些事情
。“程序
”的
言并没有要求。程序
对接口进行
操作。服务器
支持
CGI就要提供CGI中要求的环境变量
,或者还有别的。我的理解至此为之。

 

CLI
:“ 命令
行界面”(Command Line Interface),可在用户
提示符下键入可执行指令
的界面。

 

SAPI
:“ 服务器
应用程序
接口”(Server Application Programme Interface),可以认为是服务器
端的API。貌似和CGI是一个东西
,每个服务器
提供的API可能不同,但是他们都提供了CGI。所以可以理解CGI是每个服务器
应该
有的SAPI。apache
有自己的SAPI,IIS也有自己的。但是php
能这些不同的服务器
端工作,因为php
支持
了它们各自的SAPI。(CGI和CLI都是SAPI的

)

 

ISAPI
:ISAPI 服务器
扩展
是可以被 HTTP 服务器
加载
调用
的 DLL。Internet 服务器
扩展
也称为 Internet 服务器
应用程序
(ISA),用于增强符合 Internet 服务器
API (ISAPI) 的服务器
功能
。ISA 通过浏览器
应用程序
调用
,并且将相似的功能
提供给通用网关接口 (CGI) 应用程序

 

*(ISAPI的DLL应用程序
和WEB服务器
处于同一个进程
中,效率
要显著高于CGI)

*php
CGI和php
SAPI为php
在Web服务器
上运行的php
环境;php
CLI为php
命令
行运行的接口

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

php
的CLI 和 CGI

 

PHP 5 中对 CLI 和 CGI 文件
名作了些改变。PHP 5 中,CGI 版本
被改名为 php
-cgi.exe
(以前是 php
.exe
),现在主目录
中的是 CLI 版本
(之前是 cli/php
.exe
)。

PHP 5 中引进了一种新模式
php
-win.exe
。这和 CLI 版本
相同,只除了 php
-win 不输出
任何内容
,因此不会
提供控制台
(屏幕上不会
闪过“dos 窗口”)。此行为
php
-gtk。

PHP 5 中,CLI 版本
总会产生全局变量
$argv 和 $argc 而不管 php
.ini 是怎么设的。即使将 register_argc_argv 设为 off 也不影响 CLI。

 

 

以CGI方式
运行PHP

 

<Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Allow from all

#    Deny from all

#不能有deny from all

    Satisfy all

</Directory>

 

AddType application/x-httpd
-php
.php

Scrip
tAlias /php
5/ "D:/php
5/"

#必须有结尾的“/”

Action application/x-httpd
-php
"/php
5/php
-cgi.exe
"

#必须为php
-cgi.exe

#

Apache里PHP以模块
方式
运行和CGI方式
运行的区别
: 

在CGI方式
运行时占用的资源

,在ISAPI模式
下的资源
相对就较少点,也比较稳定.

 

模式
方式
运行需要的配置

LoadModule php
5_module        modules/libphp
5.so

//添加php
解析的扩展

AddType application/x-httpd
-php
.php

//添加.Z解析的扩展

AddType application/x-compres
s .Z

//添加压缩文件
解析的扩展

AddType application/x-gzip
.gz .tgz

 

 

以CLI方式
运行PHP

 

1*直接在终端执行php

sjolzy@localhost# php
-r 'print
_r(get_defined_constants());'

 

2*运行php
-cli脚本
文件

sjolzy@localhost# php
my_scrip
t.php

sjolzy@localhost# php
-f my_scrip
t.php

以上两种方法
使用
或不使用
-f 参数
)都能够运行给定的 my_scrip
t.php
文件
。可以选择
任何文件
来运行,指定的 PHP 脚本
并非必须要以 .php
扩展
名,它们可以有任意的文件
名和扩展
名。

 

3*通过标准
输入(stdin)提供需要运行的 PHP 代码

以上用法提供了非常强大的功能
,使得可以如下范例所示,动态
地生成 PHP 代码
并通过命令
行运行这些代码

$ some_application | some_filter
| php
| sort -u >final_output.txt

 

以上三种运行代码
方法
不能同时使用

 

用Cron执行php
-cli脚本

cron是一个linux
下的定时执行工具
,可以在无需人工干预的情况下运行作业,周期
性作业,比如备份数据
,Preminder定期查询PR等等,添加的方法
:打开/etc/crontab,添加:

0 13 * * * /usr/bin/php
-f /home/php
scrip
ts/php
cli.php