php - 如何让 pthreads 在 PHP 中工作?

标签 php multithreading pthreads

我正在使用 wampserver 在我的本地计算机上测试和运行 wordpress 代码。为了运行 pthread,我遵循了以下步骤:

1) 我从 http://windows.php.net/downloads/pecl/releases/pthreads/0.44/ 得到了 pthread zip 文件 (我的机器有 php 5.3.13 并从上面的链接下载了 php_pthreads-0.44-5.3-ts-vc9-x86.zip 文件)。

2) 解压缩 zip 文件。将 php_pthreads.dll 移动到 C:\wamp\bin\php\php5.3.13\ext 目录。

3) 将 pthreadVC2.dll 移动到 C:\wamp\bin\php\php5.3.13 目录。

4) 然后打开C:\wamp\bin\php\php5.3.13\php.ini,在开头添加代码extension=php_pthreads.dll文件。

但是当我尝试运行以下代码时:

<?php
class My extends Thread {
    public function run() {
        printf("%s is Thread #%lu\n", __CLASS__, $this->getThreadId());
    }
}
$my = new My();
$my->start();
?>

它给我以下错误:

fatal error :在第 2 行的 C:\wamp\www\wp-admin\includes\post.php 中找不到“线程”类

你能告诉我如何在我的电脑上安装 pthreads 以与 php 一起使用吗?我必须安装任何其他软件吗?

最佳答案

我注意到 wampserver 在两个不同的地方有 php.ini。一处在/wamp/bin/php/php5...目录下,另一处在/wamp/bin/apache/apache.../bin目录下(其中“...”代表版本号) .这两个文件需要相同,因为显然这两个文件在整个 wampserver 启动过程中在不同的时间加载。

(请注意,我最近才发现这一点,并且可能在使用 wampserver 做一些奇特的事情时“落后于曲线”——也许其他人已经处理这两个文件很长时间了。所以我不知道这是否简单的事情会解决你的问题;我自己来这里是为了寻找关于做一些多线程的信息。:)

还有一点。根据此页面:www.php.net/manual/en/pthreads.requirements.php PHP 必须使用“--enable-zts”编译才能使 pthreads 工作。我无法找到任何证据表明 wampserver 的 PHP 部分是以这种方式编译的。


(几个月后) 决定我并不真的立即需要做任何线程的事情,我继续做其他事情,直到真正需要出现。我现在可以说编译到 WampServer 中的 PHP 版本确实支持“pthread”扩展,尽管首先需要进行一些设置工作。我看到的说明提到将几个 .dll 文件(在下载并解压缩后)放入某些位置,但这对我不起作用。将它们复制到\Windows\System32 目录确实有效。 (将它们放入\apache...\bin 目录也可以;那里还有一些其他的 php .dll 文件。)

之后,就像您所做的一样,有必要定义一个扩展“Thread”类的“类”,以便在另一个线程中实际执行某些操作。 Thread类中的“run()”函数是“抽象的”,需要在扩展类中作为实际函数“实现”。然后“new”运算符可以创建一个“实例”,即指定类的对象,以供实际使用。这是我需要的类(class):

//Purpose: Use another thread to run the code in another php file, after a delay
class xT extends Thread
{ var $fil, $tim;

  function savWhatWhen($f="", $t=0)
  { $this->fil = $f;                    //save What, file to process
    $this->tim = $t;                    //save When, delay before processing file
    return;
  }

  function run()
  { ini_set('max_execution_time', 600); //600 seconds = 10 minutes
    sleep($this->tim);                  //do a delay; beware of max-exec-time!
    include($this->fil);                //load file-to-process, and process it
    return;
} }

“savWhatWhen()”函数是专门为基本 Thread 类的扩展而创建的。下面是使用该类的一些代码:

  $TH = new xT();                                    //prepare a separate Thread
  $TH->savWhatWhen("d:/wamp/myscripts/test.php", 45);//file-name and delay time
  $TH->start();                                      //after delay, process file
  //the code that does this can terminate, while OTHER thread is doing a delay

请注意任何复制此代码的人,您可能需要确保 php.ini 中的“open_basedir”设置允许访问指定文件。


几个月后:由于有很多事情要做,我没有花太多时间来使用我的 pthread 对象。我确实遇到了一个特殊情况,这让我想知道我是否真的可以按照我希望的方式使用 pthreads。这是我观察到的: 1. AJAX 调用初始 php 文件来执行某些操作。 2. Web 服务器上的 PHP 处理器执行该操作。 3.各种数据应该回显到浏览器。 4. 初始 php 文件要求创建另一个线程,然后终止。 5、浏览器还没有收到回显数据! 6. Web 服务器上的 PHP 处理器完成委托(delegate)给第二个线程的工作。 7. 当第二个线程终止时,浏览器现在接收到回显数据!

在撰写本文时,我想我错过了一些东西。也许我需要在第一个线程结束时做一些强制性的“刷新”操作,以便浏览器可以接收回显数据,并且用户可以在服务器上的 PHP 处理器也在做事的同时做事。

关于php - 如何让 pthreads 在 PHP 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17417242/

相关文章:

php使用insert语句添加到数据库

Java 等待线程问题

c# - RunWorkerAsync 完成时关闭BackgroundWorker

c - 非常奇怪的问题 - C 和 pthreads

c++ - 如何正确地将 vector <int>转换为void*并返回 vector <int>?

php - 需要帮助返回数据库表中所有内容的数组 PHP/PDO

php - 我可以在 mysqli 中使用 select * from table 和内连接以及 where 条件吗

php - 进行变音符号敏感搜索

java - Ehcache 2.10 线程被阻塞

multithreading - 为什么拥有比核心更快的线程?