- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 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://github.com/krakjoe/pthreads/tree/master/examples
免责声明:使用线程的服务器架构并没有什么错,但是当你开始创建额外的线程时,你就限制了它的可扩展性和按设计执行的能力,我可以想象设计良好的架构确实有前端线程的能力,但这不是一件容易的事情。此外,对于高性能 Web 目标应用程序,线程并不是工具箱中唯一的东西;研究所有选项。
关于php - PHP 中的多线程/多任务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10714618/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!