PHP 中的多线程/多任务

2024-01-28

在 PHP 中,我们通常在编码时不考虑服务器的功能。如今,甚至 PC 也拥有多个内核并处理 64 位数据。据我所知,PHP 引擎本身已针对利用多核进行了优化。我们程序员如何进一步优化代码以利用多核。

换句话说,我想知道教我编写代码的技术,这些代码更有可能被 php 引擎考虑并行处理。

我不是要求任何用户定义/开源排队方法,而是以这样的方式编写相同的代码,即利用多核并运行得更快。

如果您已经在做类似的事情,请提出您的想法并分享您的经验。

我希望应该有办法进一步优化代码。


自 2000 年 5 月 22 日首次发布 PHP4 以来,PHP 已经拥有线程模型很长时间了。

前端线程化

在 Web 应用程序的前端创建用户线程没有任何意义;规模化极其困难。 Apache Worker MPM 二进制文件和 mod_php 使用的每个客户端线程模型并不是您真正想要用来为您的网站提供服务的东西,当然,如果您正在使用它,您也不想创建额外的线程来直接响应任何 Web 请求。

为什么前端的线程是一个坏主意?

您可能经常听到开发人员说前端的线程没有意义,但没有提供这种说法的基本原理。当您学会以所需的方式思考系统时,问题就变得显而易见:

如果客户端脚本创建 8 个线程来直接响应 Web 请求,并且 100 个客户端同时请求该脚本,则您正在请求硬件执行800并发线程。

CPU 的外观和工作方式必须非常不同才能成为一个好主意

我们对于它可以做些什么呢 ?

进取型解决方案很可能有一个面向公众的 PHP 网站,但系统的实际大脑是用对构建进取型解决方案所需的东西提供良好支持的语言编写的,例如 Java、C#、C++ 或任何语言 -那天是。

您应该以同样的方式使用 pthreads;通过设计其组成部分彼此分离的系统,仅通过精心设计的高性能 (RPC) API 连接,从而使设计多线程架构固有的复杂性与面向公众的网站完全隔离,并且简单、此类网站需要的可扩展设置。

您现在可以使用危险代码

让我们从 Hello World 开始:

<?php
class My extends Thread {
    public function run() {
        printf("Hello World\n");
    }
}

/* create a new Thread */
$my = new My();

/* start the Thread */
$my->start();

/* do not allow PHP to manage the shutdown of your Threads */
/* if a variable goes out of scope in PHP it is destroyed */
/* joining explicitly ensures integrity of the data contained in an objects */
/* members while other contexts may be accessing them */
$my->join();
?>

很无聊,但我希望你能读一下;)

因此,在真实的系统中,您实际上并不希望如此明确地创建线程,您肯定只想将任务提交给某些执行器服务,所有复杂的系统,就其多任务要求而言,我曾经见过用这样的东西...

<?php
class My extends Threaded {
    public function run() {
        printf("Hello World from %s#%lu\n",
            __CLASS__, Thread::getCurrentThreadId());   
    }
}

/* create a Pool of four threads */
/* threads in a pool are created when required */
$pool = new Pool(4);

/* submit a few tasks to the pool */
$tasks = 100;
while ($tasks--) {
    $pool->submit(new My());
}

/* shutting down the pool is tantamount to joining all workers */
/* remember what I said about joining ? */
$pool->shutdown();
?>

我已经对复杂的事情给了你非常简短的解释,你应该尽力阅读所有可以阅读的内容:

  • https://gist.github.com/krakjoe/6437782 https://gist.github.com/krakjoe/6437782
  • https://gist.github.com/krakjoe/9384409 https://gist.github.com/krakjoe/9384409
  • http://php.net/pthreads http://php.net/pthreads

许多例子可以在这里找到:https://github.com/krakjoe/pthreads/tree/master/examples https://github.com/krakjoe/pthreads/tree/master/examples

免责声明:使用线程的服务器架构并没有什么问题,但是当您开始创建额外的线程时,您就限制了它的可扩展性和按照设计执行的能力,我可以想象设计良好的架构确实具有线程的能力在前端,但要实现这一目标并不是一件容易的事。此外,当涉及高性能 Web 目标应用程序时,线程并不是工具箱中唯一的东西。研究你所有的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 中的多线程/多任务 的相关文章

  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • Laravel 内存问题?

    各位 我在 DO 服务器上遇到这样的问题 我已经尝试了一切 整个网站在使用 Homestead 的 Linux 服务器上 100 正常工作 但上传后 它只能工作一次 在重新加载或刷新页面后会多次下降 我尝试增加 apache 服务器的内存
  • PHP - 将数据从一个站点安全地传递到另一个站点

    我有一个可以接受来自多个站点的请求的站点 有点像升级检查 这些网站将发送用户名 密码 应用程序版本等信息 然后我的网站将根据这些信息发送响应 基本上这是一个 GET请求 例如 http www mysite com user boo pas
  • 从 PHP 访问 JavaScript 变量

    我需要访问一个JavaScript变量与PHP 这是我当前正在尝试的代码的精简版本 该版本不起作用 我对 JavaScript 和 PHP 都是新手 所以我非常感谢任何建议 UPDATE 好吧 我想我过于简化了 我想做的是创建一个表单 提交
  • count() 参数必须是一个数组或一个在 Laravel 中实现 countable 的对象

    这是这里的代码 protected function credentials Request request admin admin where email request gt email gt first if count admin
  • 无法在 PHP 中使用 SFTP

    我正在用 PHP 编写一个简单的 SFTP 客户端 因为我们需要通过 n 个远程服务器以编程方式检索文件 我正在使用 PECL SSH2 扩展 不过 我遇到了障碍 php net 上的文档建议您可以这样做 stream fopen ssh2
  • 快速查找具有最大总不同元素的列表列表的子集

    给定元组列表的列表 我想找到列表的子集 该子集最大化不同整数值的数量 而不重复任何整数 该列表看起来像这样 x 1 2 3 8 9 10 15 16 2 3 10 11 9 10 11 17 18 19 20 21 22 4 5 11 12
  • php脚本阻止直接访问

    我正在使用 ajax 从 php 脚本 例如 cost php 获取值 并且我知道直接访问它并获取该值会很容易 我什至在同一个脚本 cost php 上运行 cron 作业 所以如果我使用以下命令 cron 作业将无法工作 if empty
  • 如何使用 Magento 测试 cron?

    首先我需要了解 Magento cron 是如何工作的 我知道 cron 在 Linux 上如何工作 使用crontab e 我知道我需要设置 Magento 的 cron php 定期运行 但是当我在 magento 配置文件中定义 cr
  • PHP中的“@/path/to/a/file”是什么意思?

    我偶然发现以下代码示例 image file path code tmhOAuth gt request POST https upload twitter com 1 statuses update with media json arr
  • 提交表单时显示警告框

    所以我有这两页 pageOne php and pageTwo php 表格在pageOne php
  • Laravel 中 Twitter Bootstrap 导航的自动活动类

    和大多数人一样 我正在使用 Twitter Bootstrap 来构建我目前在 Laravel 中开发的网站 到目前为止 我很喜欢使用 Laravel 作为与 Rails 相当的 PHP 但我想知道是否有更好的方法来制作导航栏 我试图确保我
  • 无法使用 PHP mail() 发送电子邮件。您的服务器可能未配置为使用此方法发送邮件

    我尝试使用 codeigniter 框架发送邮件 但它会引发错误 无法使用 PHP mail 发送电子邮件 您的服务器可能未配置为使用此方法发送邮件 From prakash t lt email protected cdn cgi l e
  • 证明字符串算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 实验室数据与 Google Page Insight 的起源摘要之间的混淆

    任何知道 Core web Vitals 详细信息的人请帮我解决一些问题 How 起源总结与实验室数据不同吗 Speed Insight 如何获取起源摘要 这是同一页面或相似页面最近 28 天的总评分吗 我检查了具有相同内容的网站类别页面L
  • 优化构建中通用函数的 Core Data Swift 转换失败

    我们有一个具有相当广泛的核心数据模型的应用程序 其中有许多用 Objective C 实现的自定义子类 但越来越多的用 Swift 编写的应用程序也使用这些子类 值得一提的是 我们使用 Xcode 7 3 1 针对 iOS 9 3 进行构建
  • Laravel 中的 SQL 运算符是什么?

    我正在查看 Laravel 的源代码 发现了很多 Eloquent 的 SQL 运算符 我想知道其中一些是什么以及如何使用它们 不幸的是我没有找到任何文档 这是我找到的运营商vendor laravel framework src Illu
  • 限制传出 PHP+curl 请求的速率

    有没有办法限制 有延迟 向外部服务器发出 PHP curl 请求的速率 以便每秒只有 n 个请求 PHP 在 Fastcgi 模式下使用 因此无法使用睡眠 是的 有curl 多重处理程序 您可以使用 OOP 方式以 OOP 方式完成此操作这
  • R 中的约束优化

    我正在尝试使用http rss acs unt edu Rdoc library stats html constrOptim html http rss acs unt edu Rdoc library stats html constr
  • 检测图像是否损坏或损坏

    我需要以编程方式检查用户在我的应用程序上选择作为壁纸的图像是否已损坏或损坏 基本上我为用户提供了选择自己的图像作为壁纸的选项 现在 当图像加载时 我只想检查它是否已损坏 如果您正在寻找 PHP 解决方案而不是 javascript 解决方案

随机推荐