php语言本身是不支持多线程,但php提供了pcntl_fork 函数可以帮助我们实现多线程运行:
pcntl_fock函数官方介绍:
说明
int pcntl_fork ( void )
pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。
返回值
成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。
范例
Example #1 pcntl_fork() 示例$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}
多线程处理工具类:/**
* 多线程处理基类.
* FileName : Thread.php
*/
abstract class Thread
{
// 线程数量
private $threadNum = 10;
public static $instance = null;
private function __construct()
{
}
/**
* 单例对象实现
*
* @return $instance
*/
public static function getInstance($threadNum = 10)
{
if (self::$instance == null) {
self::$instance = new static;
}
if ($threadNum > 0) {
self::$instance->threadNum = $threadNum;
}
return self::$instance;
}
/**
* 脚本启动前处理.
*/
public function beforeRun()
{
}
/**
* 启动脚本.
*/
public function start()
{
$this->beforeRun();
if (function_exists('pcntl_fork') && $this->getThreadNum() > 1) {
for ($x = 0; $x getThreadNum() ; $x++) {
$pid = pcntl_fork();
if ($pid == -1) {
echo "subprocess create faild!".PHP_EOL;
} elseif ($pid) {
$this->run();
exit();
} else {
pcntl_wait($status);
}
}
} else {
$this->run();
}
$this->afterRun();
}
/**
* 脚本运行后处理.
*/
public function afterRun()
{
}
/**
* 获取进程数.
*/
public function getThreadNum()
{
return $this->threadNum;
}
/**
* 设置进程数.
*/
public function setThreadNum($num)
{
$this->threadNum = $num;
}
/**
* 抽象的业务方法.
*/
public abstract function run();
}
应用实现多线程:/**
* 业务多线程处理.
* FileName : Test.php
*
*/
class Test extends Thread
{
// 同时运行的进程数.
const PROGRESS_NUM = 1;
/**
* Process.
*
* @return void
*/
public function run()
{
// TODO 业务逻辑处理
}
}
// 执行多线程业务处理.
Test::getInstance(Test::PROGRESS_NUM)->start();
版权及转载说明
本站原创、转载文章欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区
本站转载文章版权归原作者所有,如发现本站文章涉嫌侵权请点击「联系我们」反馈,本站将立即给予删除
转载请注明:文章转载自:全分享社区 「http://www.aweb.cc」
本文标题:php多线程实现方法之pcntl_fork实现多线程