3

我正在使用 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) 解压压缩文件。将 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 一起使用吗?我必须安装任何其他软件吗?

4

6 回答 6

3

我注意到 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 处理器也在做事的同时做事。

于 2013-07-25T04:21:19.783 回答
1

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

于 2013-10-28T02:34:07.277 回答
1

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

于 2013-07-02T08:21:56.813 回答
1

我遇到了同样的问题,在我的情况pthreadVC2.dll

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

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

于 2014-03-02T17:30:09.147 回答
0

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

要将浏览器中的 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

于 2014-05-12T20:47:59.120 回答
0

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

这是Pthread 的下载页面安装页面。请注意上面提到的两个 php.ini 位置(Apache 文件夹=浏览器,PHP 文件夹=CLI)。

于 2016-06-26T00:01:21.317 回答