php通过fork和管道实现多进程
2016-08-31 10:18
501 查看
php通过fork和管道实现多进程
最近遇到两个问题
问题一
问题二
最近遇到两个问题
问题一
做php爬虫,使用fork启动多进程通过curl抓取数据,通过log分析发现只有一个进程能够执行,没找到原因 改用管道去启动多进程则无碍。 ` //多进程 class MultiProcess{ /** * 启动多个进程运行程序 * * @param type $func * @param type $params * @param type $obj * @param type $count * @return type */ public static function multProcessRun($func,$params,$obj="",$count=20){ //运行进程 for($i=0;$i<$count;++$i){ if(!isset($params[$i])) continue; $pid = pcntl_fork(); if($pid == -1){ die("fork error "); }else if(!$pid){ //if(DEBUG == 1) usleep(100000); if(empty($obj)){ $func($params); }else{ call_user_func_array(array($obj,$func),array($params[$i])); } exit(0); } } //等待结束 $ret = false; while(pcntl_waitpid(0,$status) != -1){ $status = pcntl_wexitstatus($status); if(DEBUG == 1){ //echo $status.'#'; } $ret = $ret && $status; } return $ret; } } //管道 class Pipler { /** * 检查进程的数目 */ public static function checkProcessCount($str=INFO_SCRIPT_PHP){ exec("ps -ef | grep '".$str."' | grep -v grep | wc -l",$arr,$ret); return intval(trim($arr[0])); } /** * 运行进程 */ public static function runProcess($params=array()){ $process_num = self::checkProcessCount(); if($process_num > MAX_PROCESS_COUNT){ return false; } $cmd = PHP_EXEC." ".INFO_SCRIPT_PHP." ". implode(" ", $params); $cmd .= " &"; //echo $cmd; pclose(popen($cmd, "r")); return true; } } `
问题二
使用本地的存储去记录已经抓取的页面链接,使用sqlite和leveldb都不行,他们都有锁的而我的爬虫是多进程的!!! 因为这个问题迫使我去学习一门支持多进程的静态编程语言。 因为这个原因我打算玩玩c/c++,当然用dlang也可以解决这个问题,可是如果我使用dlang开发这个爬虫以后,下一个维护这个项目的人肯定有杀了我的冲动,说不定他会重写。。java是一个好的选择。
相关文章推荐
- 使用pipe()与fork()函数通过管道实现父子进程之间的通信
- Linux下用fork()派生的子进程通过pipe管道通讯的实例详解("生产者-消费者"问题)
- linux下通过调用fork函数实现多进程
- 在 AIX 上通过数据管道实现进程间通讯
- 实验 9-1 1. 实现以下功能 a) 调用 pipe()创建无名管道 b) 调用 fork 创建一个子进程 c) 在子进程中向管道内写入 128k 数据,打印出进程号及成功写入的字节数 d) 在父
- 父子进程通过管道实现文件复制
- php-通过共享内存实现消息队列和进程通信
- fork()+pipe() --> 父子进程间通过管道通信
- UNIX环境高级编程学习之第十五章进程间通信 - 通过半双工匿名管道实现父子进程通信
- fork、execl , waitpid实现父子进程管道间通讯
- linux进程间通过管道通信实现简单的tftp
- PHP使用pcntl_fork实现多进程下载图片的方法
- linux c之通过管道实现兄弟间进程通信:
- ★实验 9-2 1. 补全代码,实现以下功能 a) 调用pipe()创建无名管道 b) 调用fork创建一个子进程 c) 在父进程中向管道写入 “helloworld”, 同时打印出PID和写入
- PHP使用pcntl_fork实现多进程下载图片的方法
- PHP的多进程模型-fork实现
- UNIX环境高级编程学习之第十五章进程间通信 - 通过匿名管道实现父子进程同步
- PHP Linux Cli 模式下利用 pcntl_fork实现多进程处理
- linux c之通过管道父子进程实现同步通信
- 通过设置P3P头来实现跨域访问COOKIE - PHP技术