问题标签 [php-pthread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
257 浏览

php - PHP Pthread池管理

(第一个问题如下)

终于如我所愿!好头疼^^

不使用池是答案;)

所以,这是我的代码,输出如下!

正如您在输出中看到的那样,我的工作在工人 1 和 2 之间平均分配,而工人 0 正在运行一项长时间的工作!

输出: 在工人 0 上堆叠作业 0 在工人
1 上堆叠作业 1 在工人
2 上堆叠作业 2
STARTING 1
STARTING 0
STARTING 2
ENDING 1
ENDING 2
在工人 1 上
堆叠作业 3 在工人 2 上堆叠作业 4
STARTING 3
STARTING 4
ENDING 3
ENDING 4
将作业 5 堆叠在工人 1 上 将
作业 6 堆叠在工人 2 上
STARTING 5
STARTING 6
ENDING 5
ENDING 6
将作业 7 堆叠在工人 1
上 将作业 8 堆叠在工人 2 上
STARTING 7
STARTING 8
关闭工人:0
ENDING 8
ENDING 7
ENDING 0
关闭工人:1
关闭工人:2


我正在开发一个 pthread 系统,并且我正在尝试实现一种池系统。

目前,我正在创建一个由 3 个工作人员组成的池,然后使用 pool->submit() 发送我的工作。

然后,pool->collect()

和 pool->shutdown()

但是,我对结果很失望。

工作似乎平均分配给所有工人

工人 1:工作 1、4、7

工人 2:工作 2、5、8

工人 3:工作 3、6、9

然后,假设我的工作 1 很长,而其他所有工作都不长,我的工作将像这样完成:

2、5、3、6、8、9、1、4、7

但是,我想要实现的应该更像:2、3、5、4、6、8、7、9、1

就像将工作分配给最近的不工作的工人一样,所以我的繁重工作在工人 1 上运行,而所有其他工作都交给工人 2 和 3

这是可行的吗?

我在这里错过了什么?

代码示例:

结果:
开始 1
开始 2
开始 3
结束 2
开始 5
结束 3
开始 6
结束 5
开始 8
结束 6
开始 9
结束 8
结束 9
结束 1
开始 4
结束 4
开始 7
结束 7

0 投票
2 回答
2881 浏览

php - php 为什么我找不到类“线程”

我正在使用 php 版本 7 并定义了一个扩展 Thread 类的类,但是当我运行我的程序时,它给了我 Class 'Thread' not found 错误。我搜索并发现我必须复制pthreadVC2.dll到 apache 和 system32 文件夹并复制php_pthreads.dll到 php/ ext 和 system32 文件夹并添加extension=php_pthreads.dllphp.ini. 我做了所有这些工作,但我再次收到该错误。php_pthreads.dll版本pthreadVC2.dll是 14

0 投票
0 回答
346 浏览

php - 线程 PHP 中的 Sleep()

我有一个 PHP 脚本,我在其中使用 pthread 库创建了几个线程。在这些线程中,我使用 sleep() 函数。问题是 sleep() 暂停了我的主线程。所以我失去了制作线程的所有优势......

有没有人可以在不暂停主线程的情况下暂停我的线程?

这个线程类调用另一个睡眠所在的 php 脚本。

这是线程调用的脚本。

提前致谢。

0 投票
0 回答
394 浏览

php - 尝试多线程 SSH 连接

我有一堆服务器,我喜欢创建一个 php 脚本来 ssh 我的所有服务器,收集最后一个日志条目并将所有结果插入数据库。

我正在使用 phpseclib 连接到服务器,并且一个接一个它工作正常,但是因为我有很多,我为什么不使用线程?

好吧,我不太确定我在这里缺少什么,但是到目前为止我得到了什么。在线程之外一切正常,但是一旦我线程 NET_SSH2->login 一切都变得 appart 并且没有任何效果。

这是我的代码关于我遗漏的任何线索?

谢谢

0 投票
0 回答
40 浏览

php - PHP的pthreads扩展中的Socket类的目的是什么

PHP 的 pthreads 扩展有一个未记录的套接字类,适当地命名为“套接字”。扩展的示例文件夹中至少有一个使用 Socket 类的示例,但除此之外(以及浏览扩展的 C 代码),人们甚至不知道它的存在。

我有三个问题:

  • 鉴于 PHP 现有且成熟的套接字功能,这个新的 Socket 类的目的是什么?
  • 假设它试图使至少一些套接字资源/函数在线程之间使用更安全,那么它的限制是什么?
  • 该类不仅是现有套接字函数的简单包装器,而且本身就是一个详尽的套接字实现。班级整体发展状况如何?
0 投票
1 回答
3702 浏览

php - 无法加载动态库“C:\php\ext\php_pthreads.dll”

我试图在我的 php 代码中使用线程,但我无法理解 pthreads库,每次运行程序时都会遇到此错误:

我遵循了所需的每一步:

这是我的phpinfo()

这是我使用的 pthreads 版本:

我已经阅读了有关该问题的类似主题,甚至根据视频教程逐步尝试了所有内容,但没有任何效果。我究竟做错了什么?

0 投票
1 回答
200 浏览

php - 使用zend框架3在php中进行多处理

是否可以从 http 请求在 php 中进行多进程/多线程。

背景

我正在做一个项目,我希望将一些数据(不是来自用户,因此数据上传是一致的)上传到 api。

我想解耦这个过程,如果数据上传成功,我通知这个客户端并断开它并在另一个线程中处理数据。现在,客户端等待处理数据并成功断开连接。

我的研究

我已经研究过分叉一个进程,但它总是带有一个警告,即不要在 Web 服务器上使用它,另外我想要一个可以与我正在处理的项目一起扩展的包/模块。

Pthreads:这是 php 线程模块。如上所述,它未配置为仅在 cli 上与 Web 服务器一起使用。

amphp:这是一个用 pthreads 构建的模块,它带有同样的警告。

这提示了一个问题,如何最好地解决问题?我理解挑战,如果您为每个连接打开一个新线程,您将有 1000 个线程用于 1000 个连接,并且如果增加,很容易使服务器超载,但我的情况是独一无二的,因为我不希望为人工连接使用多线程并且可以很容易地预测连接的数量。

0 投票
1 回答
59 浏览

php - PHP ImagickDraw 线程化

我正在尝试在 PHP 上使用 ImagickDraw 来使用非常大量(~100,000)的 circle() rectangle() 等调用来绘制图像。这些在 4 个 cmyk 通道之间拆分,因此每个通道大约有 30k 调用。

实际circle()rectangle()调用本身非常快,程序的整个部分在不到一秒的时间内运行;然后我点击了我drawImage在 4 个单独ImagickDraw对象中的每一个上使用的部分,这需要超过 15 秒才能运行每一层......明白这是一个非常复杂的图像,但有什么办法可以加快速度吗?

我考虑过使用 pthread,为 4 个ImagickDraw对象中的每一个都有一个单独的 pthread,这只是导致程序挂起:

谢谢!

0 投票
1 回答
470 浏览

php - PHP 多线程 - 当所有线程准备就绪时,如何从它们获取结果?

我正在尝试使用 PHP 学习多线程。我已经安装PHP 7.2.14了ZTS支持,并且在网上查看了很多示例,然后尝试创建一个简单的脚本,看看我是否理解我所学的东西。问题是,看来,我没有:)

这是我制作的脚本:

这个脚本应该创建 15 个单独的任务,并且在每个任务中我必须迭代 100 次。在每 100 次迭代准备好后,我想存储我在MyDataHolder类中迭代的次数,以便以后能够访问它。

预期的行为是,当我运行这个脚本时,我希望100在屏幕上看到 15 次打印出来,最后,我希望看到Total: 1500打印出来。

取而代之的100是,打印了 15 次,但最后的总值仍然为空。

我究竟做错了什么?如何从每个线程中收集数据,以便稍后在程序中使用?

0 投票
0 回答
214 浏览

php - PHP多线程 - 在线程之间同步缓存文件

我创建了一个脚本,它针对游戏情况试图找到最佳解决方案。它通过模拟每一个可能的动作并量化它们来做到这一点,从而决定采取哪一个是最好的动作(这将导致最快的胜利)。为了让它更快,我pthread用下面的方式实现了 PHP 的:每次主线程需要找到一个可能的移动(我们称之为JOB),它计算当前深度中所有可能的移动,然后启动一个Pool,然后添加到它,每个可能的移动(让我们称之为TASK),因此线程分别为每个移动开发游戏树,用于所有额外的深度。

这看起来像这样:

(1) 获得了一个包含 10 个可能移动的新工作
(1) 创建了一个新池
(1) 将所有工作作为任务添加到池中

(1) 任务并发工作,并返回一个整数作为结果,存储在一个 Volatile 对象中

(1) 主线程选择一个动作并执行它
....在 (1) 处重复相同的动作,直到战斗完成

现在,TASKS使用自己的缓存,这意味着在它们工作时,它们会保存缓存并重用它们,但它们之间不会共享缓存,也不会将缓存从一个JOB转移到另一个JOB。我试图解决这个问题,并以某种方式进行管理,但我认为这不是预期的方式,因为它让一切都变慢了。

我尝试做的事情如下:创建一个类,它将所有缓存散列存储在数组中,然后在创建池之前,将其添加到一个Volatile对象中。在任务运行之前,它会检索此缓存,将其用于读/写操作,当任务完成时,它将与Volatile对象中的实例合并。这有效,就像在JOB 1中制作的缓存一样,可以在JOB 2中看到,但是它使整个过程慢得多,然后是,当每个线程只使用自己的缓存时,它是在构建树时构建的,然后在线程完成时销毁。我做错了,还是我想要的东西根本无法实现?这是我的代码:

这就是我创建任务、myVolatile和 my 的方式Pool

这是我合并两个哈希类的方法:

我已经对代码的每个部分进行了基准测试,看看我在哪里浪费时间,但一切似乎都足够快,以至于我所经历的时间增加不值得。我在想的是,问题在于Threads,有时,似乎根本没有完成任何工作,就像他们在等待某个线程一样。任何关于可能是什么问题的见解,将不胜感激。