php多进程几个例子
php多进程的实现依赖于pcntl扩展,编译PHP的时候,可以加上"–enable-pcntl"或者也可以单独编译.
有三点需要注意:
1.子进程不在执行fork之前的代码,只是把父进程的内存状况复制一份新的,所以,关于子进程的个性化设置需要单独设置.
2.输出重定向,程序中使用echo,或造成命令行的混乱,影响分辨,可以用ob_start重定向到log文件,当然,你直接使用log是更好的办法,此实例中log文件,按照进程pid分组.
3.父进程没有代码执行,将可能提前退出,子进程可能成为孤儿进程.
demo接收:
用10个子进程来处理输出任务,任务总量是1000,然后,按照任务数平均分到十个子进程当中去,代码如下:
0) { } } //任务函数 function do_task($task_num) { global $total; $start = $total / 10 * $task_num; $end = $total / 10 * ($task_num + 1); for (; $start 0); echo 'parent done' . PHP_EOL; ?>
例子,给出一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例,代码如下:
url = $url; } public function run() { if (($url = $this->url)) { $this->data = model_http_curl_get($url); } } } function model_thread_result_get($urls_array) { foreach ($urls_array as $key => $value) { $thread_array[$key] = new test_thread_run($value["url"]); $thread_array[$key]->start(); } foreach ($thread_array as $thread_array_key => $thread_array_value) { while ($thread_array[$thread_array_key]->isRunning()) { usleep(10); } if ($thread_array[$thread_array_key]->join()) { $variable_data[$thread_array_key] = $thread_array[$thread_array_key]->data; } } return $variable_data; } function model_http_curl_get($url, $userAgent = "") { $userAgent = $userAgent ? $userAgent : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)'; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 5); curl_setopt($curl, CURLOPT_USERAGENT, (www . phprm . com) $userAgent); $result = curl_exec($curl); curl_close($curl); return $result; } for ($i = 0; $i "baidu", "url" => "http://www.phprm.com/s?wd=" . mt_rand(10000, 20000) ); } $t = microtime(true); $result = model_thread_result_get($urls_array); $e = microtime(true); echo "多线程:" . ($e - $t) . "\n"; $t = microtime(true); foreach ($urls_array as $key => $value) { $result_new[$key] = model_http_curl_get($value["url"]); } $e = microtime(true); echo "For循环:" . ($e - $t) . "\n"; ?>
PHP多线程类,代码如下:
* @published: 2010-11-2 * * PHP多线程应用示例: * require_once 'thread.class.php'; * $thread = new thread(); * $thread->addthread('action_log','a'); * $thread->addthread('action_log','b'); * $thread->addthread('action_log','c'); * $thread->runthread(); * * function action_log($info) { * $log = 'log/' . microtime() . '.log'; * $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn"; * $fp = fopen($log, 'w'); * fwrite($fp, $txt); * fclose($fp); * } */ class thread { var $hooks = array(); var $args = array(); function thread() { } function addthread($func) { $args = array_slice(func_get_args() , 1); $this->hooks[] = $func; $this->args[] = $args; return true; } function runthread() { if (isset($_GET['flag'])) { $flag = intval($_GET['flag']); } if ($flag || $flag === 0) { call_user_func_array($this->hooks[$flag], $this->args[$flag]); } else { for ($i = 0, $size = count($this->hooks); $i
使用方法,代码如下:
$thread = new thread(); $thread->addthread('func1','info1'); $thread->addthread('func2','info2'); $thread->addthread('func3','info3'); $thread->runthread();
说明:addthread是添加线程函数,第一个参数是函数名,之后的参数(可选)为传递给指定函数的参数.
runthread是执行线程的函数.
在linux系统中需要配置安装一下pthreads
1、扩展的编译安装(Linux),www.phprm.com 编辑参数 --enable-maintainer-zts 是必选项,代码如下:
cd /Data/tgz/php-5.5.1 ./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts make clean make make install unzip pthreads-master.zip cd pthreads-master /Data/apps/php/bin/phpize ./configure --with-php-config=/Data/apps/php/bin/php-config make make install vi /Data/apps/php/etc/php.ini 添加如下代码:
extension = "pthreads.so"
PHP扩展下载:https://github.com/krakjoe/pthreads
PHP手册文档:http://php.net/manual/zh/book.pthreads.php
文章网址:
随意转载^^但请附上教程地址。
上一篇: php中数组之数据类型详解
下一篇: php如何对手机号码进行验证