用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编写需要线程的处理的讲话。

广告
将在 10 秒后关闭
bannerAds