• 服务器端PHP多进程编程实战

  • http://developer.51cto.com  2010-10-15 08:57  Bruce Dou  博客  我要评论(0)
  • PHP是目前应用最广泛的Web开发语言,所以用PHP来做服务器端的应用可以降低成本。文章将介绍一个PHP在服务器端的多进程编程实例,在很多场景下,比如邮件的分发、远程服务的调用、数据的聚合、计划任务等等,都能够用到PHP多进程编程。
最近比较PHP跟Python, Erlang的特性,发现PHP有很多人们不常用到的特性。用PHP CLI可以实现很多不错的应用。比如做搜索引擎的爬虫, 长期运行的计算脚本, 完全可以取代其他语言来做服务器的运维。这对于熟悉PHP的人来说如虎添翼。
51CTO推荐阅读:让PHP开发者事半功倍的十大技巧
为什么PHP多进程很好? 网游服务器大部分都使用多线程而不是多进程的原因也在于进程比线程更加稳定。而且多线程适合现在多核服务器的应用场景,更能发挥多核运算的能力。进程的维护可以用很多操作系统级别的工具。Message Queue解决了多大部分线程通信问题。所以PHP多进程很适合做服务器端的计算密集型的应用。
据一家越南IT公司介绍,他们成功的把PHP后台多进程用在法律文件的分发、处理银行账户的金额这样的企业级的应用上。
使用后台PHP进程可以不影响服务器同时处理网页的请求。这种后台进程一旦发生失败很容易查处原因进行恢复或者补救,所以健壮性更高。不同的进程相互隔离,更加高效,可以统一调度各个服务进程。
PHP是目前应用最广泛的Web开发语言,所以用PHP来做服务器端的应用可以降低成本。可以用现有人员、现有配置、甚至做到代码重用。什么样的场景更适合用PHP后台多进程呢?比如邮件的分发、远程服务的调用、数据的聚合、计划任务、计算结果的缓存这些不需要立即返回的地方。
PHP单进程在某些地方完全可以达到目的,而且更加容易实现,不用考虑进程的同步问题,不用考虑数据的共享问题。PHP CLI(SAPI SERVER API) 命令行接口可以用来做CRON计划任务, 图形界面程序 (使用GTK库)。
PHP CLI例子
  1. php -f test.php
  2. php -r “echo time();”
  3. php -R as python style
PHP读取命令行参数:
  1. <?php
  2. #!/usr/bin/php -q
  3. echo “Test Arguments:\n”;
  4. echo $_SERVER["argc"].”\n”;
  5. echo $_SERVER["argv"][0].”\n”;
  6. ?>
PHP命令行接口标准输入输出:
  1. <?php
  2. #!/usr/bin/php -q
  3. /* Define STDIN in case if it is not already defined by PHP for some reason */
  4. if(!defined(“STDIN”)) {
  5. define(“STDIN”, fopen(‘php://stdin’,'r’))
  6. }
  7. echo “Hello! What is your name (enter below):\n”;
  8. $strName = fread(STDIN, 80); // Read up to 80 characters or a newline
  9. echo ‘Hello ‘ , $strName , “\n”;
  10. ?>
CRONJOB可以定时运行某些任务,但要防止重复运行。开始时创建一个锁文件, 结束时删除。或者用ps命令来处理。任务队列可以用MySQL来实现,或者Key/VALUE数据库,或者消息队列来实现。
进程控制相关函数:
  1. Process Control Extensions
  2. pcntl_fork()
  3. posix_setsid()
  4. posix_kill
  5. pcntl_wait
  6. pcntl_signal
  7. SIGHUP
  8. SIGTERM; system shutdown, kill
  9. SIGINT; sent by Ctrl+c
  10. SIGKILL (uncatchable); unresponsive, kill -9
  11. SIGCHLD; child status change
  12. SIGSTP; sent by Ctrl+z
  13. SIGCONT; resume from stop, fg
PHP不能对某些错误抛出异常,如何提高PHP多进程应用的容错性?
◆可以监控进程,依赖进程失败后报告。
◆用CRONJOB实现监控进程。
◆将被监控进程PID写成文件。
◆定时检查PID文件是否存在 检查ps -o pid=或者file_exists(‘/proc/’)。
◆如果线程不存在重启进程。
回顾以前用Java或者Python做的服务器端的服务都可以用PHP来实现。单一语言更容易维护。以往人们对于Web语言的认识很片面,例如多线程、事 务这些东西都可以改变方式来达到同样的目的。
原文链接:http://blog.eood.cn/server-side-php-progress-program-best-practice
【编辑推荐】
  1. PHP生成随机字符串的三种方法
  2. 百万级PHP网站架构工具箱
  3. 大型Web应用运行时 PHP负载均衡指南
  4. 让PHP开发者事半功倍的十大技巧
  5. PHP资深开发者谈:缘何放弃PHP改用Python
【责任编辑:王晓东 TEL:(010)68476606】

PHP 进程 服务器

0

分享

微博 QQ 微信

收藏

上一篇:RAID技术问题多 技术改革趋势... 下一篇:简述PostgreSQL字符集的...
51bom

492篇文章,19W+人气,0粉丝

转载于:https://blog.51cto.com/2189440bop58/406949

服务器端PHP多进程编程实战相关推荐

  1. 服务器端PHP多进程编程

    待更新 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载于:https://www.cnblogs.com/stevin-john/p/4768962.html

  2. 【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行

    [2021最新版]Python 并发编程实战,用多线程.多进程.多协程加速程序运行 视频地址:https://www.bilibili.com/video/BV1bK411A7tV/ P1 Pytho ...

  3. 《JavaScript编程实战》

    <JavaScript编程实战> 基本信息 原书名:JavaScript programming: pushing the limits 作者: (美)Jon Raasch 译者: 吴海星 ...

  4. 基于Winsock API的VC网络编程实战

    基于Winsock API的VC网络编程实战 随着计算机信息技术的飞速发展,互联网与人类社会的工作.生活越来越紧密相关,它已经成为人类获取.交流信息的重要途径和手段.所以当前对于开发人员来说,网络编程 ...

  5. NIO网络编程实战之简单多人聊天室

    NIO网络编程实战 利用NIO编程知识,实现多人聊天室. 1. NIO编程实现步骤 第一步:创建Selector 第二步:创建ServerSocketChannel,并绑定监听端口 第三步:将Chan ...

  6. 第13次预习课-20180919 多进程编程

    多进程编程 进程和线程之间的区别 Linux查看: 1)进程: ps –ef 2)跟python相关的进程 ps –ef|grep python [root@iZ2zejbxp2btn9jh8knip ...

  7. Linux下C编程实战

    2019独角兽企业重金招聘Python工程师标准>>> Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于 ...

  8. linuxC编程实战 my_server.c例子问题总结

    今天看linux C 编程实战的my_server例子时,敲到这段代码,对其父子进程关闭socket 进行close调用产生疑问 如图中标注的三个close socket,思考子进程通信结束 关闭自己 ...

  9. 《C#多线程编程实战(原书第2版)》——3.6 在线程池中使用等待事件处理器及超时...

    本节书摘来自华章出版社<C#多线程编程实战(原书第2版)>一书中的第3章,第3.6节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问 ...

最新文章

  1. 计算机组成原理——知识结构体系
  2. Agent Job相关的系统表
  3. 高并发编程-线程生产者消费者的综合示例
  4. linux运行级别debian,Debian的运行级别
  5. linux基础面试题(46个汇总)
  6. php 派生类 构造,C++派生类的构造函数和析构函数
  7. Linux中 安装centos-release-scl 报错No package centos-release-scl available.
  8. 小程序基础 - wafer2 - PHP - 后台和前台 - 利用对象数组来传递表单数组的正确方法 - 下载部分(服务器到微信)
  9. pandas mysql insert_python – Pandas将数据插入MySQL
  10. Wannafly挑战赛9: B. 数一数
  11. NYOJ --277 车牌号
  12. 项目3:PHP抽奖程序 ,抽奖规则代码 分时间段
  13. C#实现Word批量转换Pdf
  14. java项目实现html转pdf的需求(支持中文和CSS样式)
  15. ios13.5.1降级_升级iOS 14尝鲜后 无法降级iOS13.5.1?
  16. docker run 命令的 -i -t -d选项的作用
  17. Excel中如何批量合并相同内容单元格
  18. 2022-03-06:金币路径。 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,……,AN 和一个整数 B。 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+
  19. git基础(7)--打标签
  20. 单片机无线调频发射器的设计

热门文章

  1. VS2010/MFC编程入门之十七(对话框:文件对话框)
  2. jquery json 判断用户是否已注册
  3. pip和conda到底有什么不一样?
  4. Ajax操作的四个步骤
  5. AutoHotKey Script AHK脚本++Topre Realforce 104Pro十周年纪念版静电容键盘
  6. WCFAppFabric :异常消息: 内存入口检查失败
  7. 【转】解决smtplib发送多人邮件没有展示收件人的问题
  8. Java异常以及继承的一些问题
  9. Android Studio停留在“Indexing paused due to batch update”的解决方案
  10. Java 异常java.lang.IllegalArgumentException: Illegal group reference