PHP pthreads:致命错误:未找到“Thread”类

16

我在我的Web服务器上使用的是PHP5.5。现在我想要使用pthread。以下是我的PHP配置:http://dd19010.kasserver.com/infophp.php55

实施此代码后......

 <?php

class AsyncOperation extends Thread
{
    public function __construct($threadId)
    {
        $this->threadId = $threadId;
    }

    public function run()
    {
        printf("T %s: Sleeping 3sec\n", $this->threadId);
        sleep(3);
        printf("T %s: Hello World\n", $this->threadId);
    }
}

$start = microtime(true);
for ($i = 1; $i <= 5; $i++) {
    $t[$i] = new AsyncOperation($i);
    $t[$i]->start();
}
echo microtime(true) - $start . "\n";
echo "end\n";

?>

... 问题就在这个错误上:Fatal error: Class 'Thread' not found in。 我需要包含一些 include_once 或类似的东西才能让它工作吗? 我该怎么做??


2
你确定该模块已经加载到PHP了吗?根据phpinfo,与线程相关的内容都找不到。 - Paul
6个回答

8

你好,我遇到了这个问题并成功解决了它。

首先,请考虑您的PHP版本的VC版本和扩展程序的VC版本。我使用的是VC11版本的PHP,但是我附加了来自http://windows.php.net/downloads/pecl/releases/pthreads/的VC14版本的扩展程序pthreads.dll。请寻找匹配您的PHP的VC版本的较低版本。

其次,您可能错过了PHP页面上的第3步。它指出您需要将pthreadVC2.dll复制到不同的文件夹中。以下是完整的说明。

  1. 通过使用phpinfo()找出您的“PHP Extension Build”版本。您可以使用此链接-http://localhost/?phpinfo=1

  2. 下载与您的PHP版本(32位或64位)和PHP扩展构建(当前使用的为VC11)相匹配的pthreads。使用此链接进行下载-http://windows.php.net/downloads/pecl/releases/pthreads/

  3. 解压缩该zip文件 将php_pthreads.dll移动到'bin\php\ext\'目录中。 将pthreadVC2.dll移动到'bin\php\'目录中。 将pthreadVC2.dll移动到'bin\apache\bin'目录中。 将pthreadVC2.dll移动到'C:\windows\system32'目录中。

  4. 打开php\php.ini并添加 extension=php_pthreads.dll

参考:https://secure.php.net/manual/en/pthreads.installation.php


7

1) 创建一个php文件
phpinfo(); --> 运行
示例: 信息
PHP版本: 5.6.31
编译器: MSVC11 (Visual C++ 2012)
架构: x64

2) 访问网站:
http://windows.php.net/downloads/pecl/releases/pthreads/
示例2.0.9文件
编译器: VC11
架构: x64
下载php_pthreads-2.0.9-5.6-ts-vc11-x64.zip文件。

3) 解压php_pthreads.dll和pthreadVC2.dll。
wamp\bin\php\php5.6.31\ext\ --> 复制php_pthreads.dll
wamp\bin\php\php5.6.31\ --> 复制pthreadVC2.dll
wamp\bin\apache\apache2.4.27\bin --> 复制pthreadVC2.dll

4) 现在编辑php.ini
wamp\bin\apache\apache2.4.27\bin\php.ini\ --> 添加extension=php_pthreads.dll
wamp\bin\php\php5.6.31\php.ini\ --> 添加extension=php_pthreads.dll

5) 现在重新启动Wamp


5
您的phpinfo显示您的PHP禁用了线程安全。您需要安装一个具有线程安全功能的PHP版本才能使用pthreads。这可能会解决当前问题,也可能不会。

您可能还需要将pthreadsVC2.dll复制到Web服务的bin目录中。

/etc/php55/fpm/

您正在寻找包含php.ini文件的文件夹。
请确保php.ini文件中添加了以下行:
extension=php_pthreads.dll

这是正确的,第一个问题是你正在运行 nts PHP ... 首先解决这个问题... - Joe Watkins
我联系了我的网络主机提供商,他们说他们无法提供开启线程安全的php... 但是我非常需要线程... 还有其他办法吗? - ItsMeDom
唯一的方法就是更换Web主机。因此,您需要权衡多线程对您的项目是否非常重要,以确定是否值得进行Web主机更换的动荡,或者是否有其他实现方式可供使用。 - Kyohei Kaneko
@KyoheiKaneko,你知道PHP中还有哪些线程选项吗? - ItsMeDom
据我所知,我不相信php有其他的多线程选项可用。如果有的话,极有可能也需要线程安全。如果你需要多线程,那么你需要线程安全的php。 - Kyohei Kaneko

2
我正在使用WAMP,发现pthreadVC2.dll应该放到Apache文件夹中:

C:\wamp\bin\apache\apache2.4.9\bin

README.md中所写的不同,你不需要将它放在PHP文件夹中,但php_pthreads.dll仍应放在:

C:\wamp\bin\php\php5.5.12\ext

之后,在此文件中搜索:

C:\wamp\bin\apache\apache2.4.9\bin\php.ini

对于;extension=php_pgsql.dll,在其后添加extension=php_pthreads.dll(是在Apache文件夹中的bin\php.ini中,而不是PHP文件夹中的那个)。

退出WAMP并重新启动。现在,在WAMP菜单下的PHP > PHP extensions中,您应该看到新的php_pthreads扩展名。

谢谢!现在我可以在Windows环境中加载pthreads扩展了。但是我真的不明白为什么dll文件应该放在apache文件夹而不是php文件夹中,但它确实起作用 :-) - Stefano P.

0

我认为你需要在php.ini文件中包含扩展名,因为我在配置中看不到它。你可以看到每个库都有自己的部分,比如MySQL,但是线程没有这样的部分。我从未使用过线程,但那应该是个好的起点。


0

PHP默认情况下不支持线程,根据您的phpinfo似乎没有加载。请查看PHP手册以了解如何设置/配置模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接