【问题标题】:How to get pthreads working in PHP?如何让 pthreads 在 PHP 中工作?
【发布时间】:2013-07-02 04:07:42
【问题描述】:

我正在使用 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 file)。

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: Class 'Thread' not found in C:\wamp\www\wp-admin\includes\post.php on line 2

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

【问题讨论】:

  • 想知道你是否解决了这个问题,因为我遇到了同样的错误
  • 是的,我也有同样的问题:/
  • 在下面查看我的回答,了解如何正确让 pthreads 与 wamp 服务器一起工作

标签: php multithreading pthreads


【解决方案1】:

我注意到 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类中的“run()”函数是“抽象的”,需要作为扩展类中的实际函数“实现”。然后“new”操作符可以创建一个“实例”,即该指定类的对象,以供实际使用。这是我需要的课程:

//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 对象。我确实遇到了一个让我想知道我是否可以按照我希望的方式实际使用 pthread 的特殊性。这是我观察到的: 1. AJAX 调用一个初始的 php 文件来做某事。 2. Web 服务器上的 PHP 处理器做这件事。 3.各种数据应该回显到浏览器。 4. 初始的 php 文件要求创建另一个线程,然后终止。 5.浏览器还没有收到回显的数据! 6. Web 服务器上的 PHP 处理器完成委托给第二个线程的工作。 7. 当第二个线程终止时,现在浏览器接收回显数据!

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

【讨论】:

  • C:\wamp\bin\php\php5.3.13\php.ini 用于 cli 版本,但对于 web,我们必须编辑 C:\wamp\bin\apache\apache2.2.22\php。初始化
  • @Sunny 同意!有关详细信息,请参阅下面的答案
【解决方案2】:

在 php.ini 文件中检查 extension_dir = "ext"。确保它指向你的扩展所在的文件夹,并确保它没有被注释(它前面有一个分号;

【讨论】:

  • 它指向正确的文件夹extension_dir = "c:/wamp/bin/php/php5.3.13/ext/" 下方的代码我放在该行下面:extension=php_pthreads.dll 你能告诉我是否为我的 php 5.3.13 下载了正确的 zip 文件版本?如果没有,请告诉我这个列表中的哪一个:http://windows.php.net/downloads/pecl/releases/pthreads/
  • 给定的路径是相对于你的 PHP 目录的,所以它可能应该只是“ext”。我不确定这是否重要,但尝试将extension=php_pthreads.dll移动到声明其他扩展的部分(执行“查找”-搜索extension=)。
【解决方案3】:

你必须在扩展它之前添加一个带有 Thread 类路径的 require_once()(如果你的框架不使用自动加载类系统)

【讨论】:

  • Wamp 服务器会自动加载类,但有一个单独的 php.ini 文件用于浏览器和 cli。
【解决方案4】:

我也遇到过同样的问题,在我的例子中,将pthreadVC2.dll 放入

..wamp\bin\apache\Apache2.4.4\bin

(而不是..\wamp\bin\php\php5.4.16作为php.net中的指南)解决了问题

【讨论】:

    【解决方案5】:

    Wamp 服务器有一个单独的 php.ini 配置文件,用于浏览器和 cli。

    要将浏览器中的 pthreads 模块与 WAMP 服务器一起使用,您还需要将“pthreadVC2.dll”复制到 apache“bin”目录中。

    您现在应该在这两个文件夹中都有“pthreadVC2.dll”(如果安装在默认位置):

    C:\wamp\bin\php\php[x.x.xx]\bin
    C:\wamp\bin\apache\apache[x.x.x]\bin
    

    您还需要更新 php bin 目录和 apache bin 目录中的 php.ini 文件以包含:

    extension=php_pthreads.dll
    

    这意味着您现在可以在浏览器和带有 wamp 服务器的 cli 中使用 pthreads

    【讨论】:

      【解决方案6】:

      在遇到同样的问题后,我注意到我安装了错误的 Pthread 版本(3.1.6:需要 PHP7+),它与我的 PHP 版本(5.5.12)不兼容。解决了 Pthread 版本 0.0.44 的问题。较早的版本应该可以正常工作。

      这里是the download page for Pthreadthe installation page。注意上面提到的两个 php.ini 位置(Apache 文件夹=浏览器,PHP 文件夹=CLI)。

      【讨论】:

      • 某些 7.x 版本的 PHP 不适用于 3.1.6,包括 x86 和 x64。用于构建 PHP 和 pthread 的模块 API 版本不匹配。似乎也没有一个很好的演练如何构建它。
      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      相关资源
      最近更新 更多