用PHP进行多线程编程
由于PHP最近与其他语言不同,它是单线程的,所以通常无法在一次请求中同时执行多个处理。
它无法进行异步处理,总是按顺序逐步进行处理。
如果非得这样做,只能使用诸如`php hoge.php &`这样在不同进程中运行的方法。
http://d.hatena.ne.jp/milktea_cg7/20130529/1369821459
顺便说一下,我找到了一个叫做pthreads的模块,所以打算试用一下。
http://www.php.net/manual/zh/book.pthreads.php
如果您使用的是Linux操作系统,可以从PECL进行安装。
因为在Windows上,二进制文件已经下载好了,我们只需要找到它。
网址:http://pecl.php.net/package/pthreads
https://github.com/krakjoe/pthreads
将php_pthreads.dll文件放置在扩展目录下,将pthreadVC2.dll文件放置在环境变量Path通道处。
然后在php.ini文件中添加以下内容,并重新启动:
extension=php_pthreads.dll
这样就可以使用pthreads了。
请确认phpinfo()中已添加了pthreads项。
那么,让我们立刻行动起来吧。
<?php
class TestThread extends Thread{
/**
* @Overide
* startしたときに呼ばれる
*/
public function run(){
// 時間のかかる処理
sleep(10);
// このスレッドのIDを確認
print($this->getThreadId());
// これを呼び出したスレッドのIDを確認
print($this->getCreatorId());
}
}
// TestThreadを別スレッドで起動
$testThread1 = new TestThread();
$testThread1->start();
$testThread2 = new TestThread();
$testThread2->start();
$testThread3 = new TestThread();
$testThread3->start();
$testThread4 = new TestThread();
$testThread4->start();
$testThread5 = new TestThread();
$testThread5->start();
一开始看起来好像要花费50秒,因为有5个需要花费10秒的任务,但实际上只需要10秒就能完成处理。
TestThread::start()会调用TestThread::run(),但它会继续执行下一个任务而不等待该处理完成。
这样就能轻松地进行线程处理了。
<?php
class TestThread extends Thread{
public function run(){
sleep(10);
}
}
// TestThreadを起動
$testThread = new TestThread();
$testThread->start();
// Thread::run()がまだ走っているか → true
var_dump($testThread->isRunning());
// Thread::run()が終了するまで待機
$testThread->join();
// Thread::run()がまだ走っているか → false
var_dump($testThread->isRunning());
只需要一个选择,以下是对原文的中文翻译:
join()方法会等待线程执行结束。
有了这个方法,并行处理变得更加简单了。
嗯,这是关于不要用PHP编写需要线程的处理的讲话。