PHP 多进程 解决难题

而且, 如果输入数据非法, 而脚本没有检测, 导致abort, 也会让你很不开心.
那? 怎么办呢?
呵呵, 别着急, 多进程来帮您!
那,这是为什么呢?
优点:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源
2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
Then, 怎么做呢?
接下来, 我们使用PHP提供的POSIX和Pcntl系列函数, 来实现一个PHP命令解析器, 主进程负责接受用户输入, 然后fork子进程执行, 并负责回显子进程的结束状态.
代码如下, 我加了注释, 如果有不懂的地方, 可以翻阅手册相关函数, 或者回复留言.


代码如下:

#!/bin/env php
<?php
/** A example denoted muti-process application in php
* @filename fork.php
* @touch date Wed 10 Jun 2009 10:25:51 PM CST
* @author Laruence<laruence@baidu.com>
* @license http://www.zend.com/license/3_0.txt PHP License 3.0
* @version 1.0.0
*/
/** 确保这个函数只能运行在SHELL中 */
if
(substr(php_sapi_name(), 0, 3) !== 'cli')
{
die("This Programe can only be run in CLI mode");
}
/** 关闭最大执行事件限制, 在CLI模式下, 这个语句其实不必要 */
set_time_limit(0);
$pid = posix_getpid(); //取得主进程ID
$user = posix_getlogin(); //取得用户名
echo
<<<EOD
USAGE: [command | expression]
input php code to execute by fork a new process
input quit to exit
Shell Executor version 1.0.0 by laruence
EOD;
while
(true)
{
$prompt = "\n{$user}$ ";
$input = readline($prompt);
readline_add_history($input);
if
($input == 'quit')
{
break;
}
process_execute($input . ';');
}
exit(0);
function
process_execute($input)
{
$pid = pcntl_fork(); //创建子进程
if
($pid == 0)
{//子进程
$pid = posix_getpid();
echo
"* Process {$pid} was created, and Executed:\n\n";
eval($input); //解析命令
exit;
}
else
{//主进程
$pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态
if
(pcntl_wifexited($status))
{
echo
"\n\n* Sub process: {$return['pid']} exited with {$status}";
}
}
}

(0)

相关推荐

  • 深入解析PHP中的(伪)多线程与多进程

    (伪)多线程:借助外力利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.QUOTE:我们知道PHP本身是不支持多线程的, 但是我们的WEB服务器是支持多线程的.也就是说可以同时让多人一起访问. 这也是我在PHP中实现多线程的基础.假设我们现在运行的是a.php这个文件. 但是我在程序中又请求WEB服务器运行另一个b.php那么这两个文件将是同时执行的.(PS: 一个链接请求发送之后, WEB服务器就会执行它, 而不管客户端是否已经退出)有些时候, 我们想运行的不

  • phplock(php进程锁) v1.0 beta1

    在web开发中我们经常对我们的数据库耗时操作做缓存,但是可能出现一个陷阱,在缓存失效的一瞬间,大量的访问得到缓存失效的标示,都去后端查询数据库,导致同时大量的数据库耗时查询,出现数据库宕机等问题.此问题隐藏深,不容易查找.本项目主要用于解决php的进程间锁问题. 示例: 复制代码 代码如下: <?php /** * 测试例子,同时打开两个页面,可以发现总是同时只能一个页面进入到锁区间的代码 * @link http://code.google.com/p/phplock/ * @author s

  • PHP使用pcntl_fork实现多进程下载图片的方法

    本文实例讲述了PHP使用pcntl_fork实现多进程下载图片的方法.分享给大家供大家参考.具体分析如下: PHP pcntl_fork - 在当前进程当前位置产生分支,子进程,译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0. 注意:PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展. 1.首先在ubuntu下编译pc

  • PHP多进程编程实例

    羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进程太慢,那么,试试用多进程来搞吧.这篇文章将会介绍一下PHP多进程的基本需求,如何创建多进程以及基本的信号控制,暂时不会告诉你如何进行进程间通信和信息共享. 1. 准备 在动手之前,请确定你用的不是M$ Windows平台(因为我没有Windows).Linux / BSD / Unix应该都是没问题的.确认好了工作环境以后一起来看看我们需要的PHP模块是否都有.打开终端输入下面的命令: 复制代码 代码如下

  • Linux下实现PHP多进程的方法分享

    PHP多进程:使用PHP的Process Control Functions(PCNTL/线程控制函数) 函数参考可见:http://www.php.net/manual/zh/ref.pcntl.php 只能用在Unix Like OS,Windows不可用. 编译php的时候,需要加上–enable-pcntl,且推荐仅仅在CLI模式运行,不要在WEB服务器环境运行. 以下为实现PHP多进程的简单测试代码: 复制代码 代码如下: <?php declare(ticks=1); $bWaitF

  • 深入探究PHP的多进程编程方法

    子进程的创建 一般的子进程的写法是: <?php $pid = pcntl_fork(); if($pid == -1){ //创建失败 die('could not fork'); } else{ if($pid){ //从这里开始写的代码是父进程的 exit("parent!"); } else{ //子进程代码,为防止不停的启用子进程造成系统资源被耗尽的情况,一般子进程代码运行完成后,加入exit来确保子进程正常退出. exit("child"); }

  • php中实现进程锁与多进程的方法

    为什么需要进程锁? 主要作用就是防止你重复执行同一程序,主要用在crontab中,当你设置了一个定时任务,然后每分钟执行一次,如果不加进程锁的话,之前的进程没有执行完的情况下.每分钟都会有新的进程生成了.加上进程锁之后,每次定时任务执行的时候,就会去判断之前的进程锁是否存在,如果存在就不执行. 1.单进程的情况的进程锁实现 直接来个例子好了,写个php脚本, 就先命名为process.php吧,代码如下: <?php $lock_file = dirname(__FILE__) . "/p

  • PHP 进程锁定问题分析研究

    1. 区分读锁定 和 写 锁定. 如果每次都使用 写锁定,那么连多个进程读取一个文件也要排队,这样的效率肯定不行. 2. 区分 阻塞 与 非 阻塞模式. 一般来说,如果一个进程在写一个文件的时候,另外一个进程应该被阻塞,但是,很多时候,我们可以先干点别的事情, 然后再判断一下是否有其他人在写文件,如果没有,再加入数据,这样的效率更高. 3. 修复了 锁定文件在linux 上的bug,特别是 在 gfs 文件系统上的bug. 代码如下: 复制代码 代码如下: <?php class File_Lo

  • 解析PHP实现多进程并行执行脚本

    由于php的进程是不支持多线程的,有些场景为了方便以及提高性能,可以用php实现多进程以弥补这个不足: 复制代码 代码如下: #!/usr/bin/env php<?php$cmds=array(        array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',1),        array('/apps/bin/launcher.php','charge/promotion_props_stat

  • PHP中使用Memache作为进程锁的操作类分享

    <?php // 使用Memache 作为进程锁 class lock_processlock{ // key 的前缀 protected $sLockKeyPre; // 重试间隔 protected $iLockRetryInterval; //重试次数 protected $iLockRetryCount; //锁的过期时间 protected $iLockCacheTimeout; // 锁过期后的回调函数 protected $onLockTimeoutFunc; // memache

随机推荐