运行PHP将Apache2的使用率提高到4核

运行PHP将Apache2的使用率提高到4核,php,apache2,multiprocessing,command-line-interface,Php,Apache2,Multiprocessing,Command Line Interface,请进一步阅读下面的CLI,了解刚刚添加到对话中的CLI问题!谢谢 我编写了一个脚本,它处理一个约16万条48.1MB的xml文件和一个15万条31.1MB的文本文件,包括一些外部文件的目录搜索、大量的链接和递归检查,以及格式化并保存到html文件中的结果 当然,我确实对程序进行了几次审查,最终得到了我能想到的最有效的代码。这是一个本地程序,发电机不需要定期运行。有人可能会说,我应该使用PHP以外的其他语言,但使用simplexml等的PHP最适合我,也最适合这个目的。另外,一个固定的时间限制(

请进一步阅读下面的CLI,了解刚刚添加到对话中的CLI问题!谢谢


我编写了一个脚本,它处理一个约16万条48.1MB的xml文件和一个15万条31.1MB的文本文件,包括一些外部文件的目录搜索、大量的链接和递归检查,以及格式化并保存到html文件中的结果

当然,我确实对程序进行了几次审查,最终得到了我能想到的最有效的代码。这是一个本地程序,发电机不需要定期运行。有人可能会说,我应该使用PHP以外的其他语言,但使用simplexml等的PHP最适合我,也最适合这个目的。另外,一个固定的时间限制(“70000”)也不会困扰我

尽管在这里我的问题是,是否可以在我的linux系统上使用运行PHP脚本的4个CPU内核来制作apache2? 即使我拆分进程并同时发出多个请求,CPU使用率也不能一次超过1个CPU

我在谷歌上搜索了这个话题,但找不到解决方案,所以我可能不得不通宵运行它,尽管如此,我还是希望能得到一些帮助来推动这个话题

添加信息-这里是我的流程图片:

CLI: 我需要在linux终端中调用index.php来执行。但是我还想向脚本发送四个post变量($_post['example'])。除此之外,我正在寻找在一些输出文件中显示我的回声。是否有人可以快速使用terminal命令和php命令来跟踪其中的4个post变量:

if (PHP_SAPI === 'cli')
{
   // ...
} 

。。。很抱歉,这是我的第一次php cli交互。谢谢

不,单个PHP脚本永远不会使用多个线程,因此总是在单个内核上运行


取决于您所做的事情彼此之间的依赖程度,您无论如何都无法在多个线程上轻松拆分它们。

EDIT:Author's response


这不是一个解决方案,而是一个很好的解决方法。我使用linux/apache2安装克隆了我的虚拟机,以便在不同的vm上启动相同的进程,但文件/进程的不同部分,这允许主机系统为每个虚拟系统应用一个内核,这样我可以将进程时间分解为因子4左右。谢谢你的帖子

===============

如果它是本地的,并且您想时不时地运行它,那么您可能应该从
cron
作业调用它。这样,您可以为正在执行的每个任务生成一个流程。如果您真的想使用PHP,甚至可以从cron行调用PHP


尽管如此,听起来你还是在做一个固有的单线程过程,如果你想让它更快,可能应该使用一些不是PHP的东西来实现这一点。

也许你可以使用Spork!它是一个php库,允许您将php进程分成多个进程

<?php

use Spork\Deferred\DeferredFactory;
use Spork\ProcessManager;

$manager = new ProcessManager(new DeferredFactory());
$manager->fork(function() {
    // do something in another process!
})->then(function($output, $status) {
    // do something in the parent process when it's done!
});

解决方案,THX向ThiefMaster和Zebediah49推荐cli和我的朋友,他们通过链接支持我:/

下面是我如何通过cli调用php:

//whenRunFromCLI
//callCLI
//php index.php './data/xyfullFile1.xml' './data/xxfullFile2.utf' 0 60000
//php index.php './data/xyfullFile1.xml' './data/xxfullFile2.utf' 60000 120000
//php index.php './data/xyfullFile1.xml' './data/xxfullFile2.utf' 120000 all
if (PHP_SAPI === 'cli'){
    $_POST['xml'] = $argv[1];
    $_POST['example'] = $argv[2];
    @$_POST['rangeFrom'] = $argv[3];
    @$_POST['rangeTo'] = $argv[4];
}
以及在三个终端中调用php文件的结果:

我知道,我必须给我的虚拟机多一些内存,幸运的是我还有8GB的备用内存;-)


干杯,和平

set\u time\u limit(0)
比将其设置为任意高的数字要好。如果您将问题保留为一个问题,并将您如何解决的问题作为一个答案发布,这对每个人来说都会更清楚。不可能:哎呀!无法提交您的答案,因为:声誉低于100的用户在提问后8小时内无法回答自己的问题。您可以在4小时内自行回答。在此之前,请使用评论或编辑您的问题。是的,这正是我所期望的答案,但值得一问!谢谢这不是一个解决方案,而是一个很好的解决方法。我使用linux/apache2安装克隆了我的虚拟机,以便在不同的vm上启动相同的进程,但文件/进程的不同部分,这允许主机系统为每个虚拟系统应用一个内核,这样我可以将进程时间分解为因子4左右。谢谢你的帖子!我试过了,但我的apache仍然只使用一个cpu,即使有几个请求。也许我可以改进我的配置?我的意思是,我的apache在其他请求上使用了超过1个cpu,但在这个特定的php文件/prog上却没有……为什么要使用apache呢?我还应该在什么环境下运行php?xamp(apache for win)不会改进它…是的,cron是我用来在我不在场的情况下运行这些东西的工具。看起来我不需要i7-2600的CPU,但是需要一个非常快的单核CPU。谢谢你的快速回答!嘿,如果i7目前没有更好的事情做,它会把自己变成一个单核:P。无论如何,你可以通过分解它来实现多线程。例如,它“目录搜索外部文件”听起来像是让
find/where/>/somewhere/listOfFiles.txt
,提前运行,然后搜索索引文件,或者类似的东西。听起来你可能比其他任何东西都更爱IO。你确定你真的在这台机器上使用了一个处理器核吗?是的,一个CPU核的使用率一直都是100%。目录搜索是一项次要任务。虽然,谢谢。。。我认为有一个聪明的方法,但它似乎与IO绑定显而易见。我也找到了解决办法。。。读我的答案!这不是一个解决方案,而是一个很好的解决方法。我使用linux/apache2安装克隆了我的虚拟机,以便在不同的vm上启动相同的进程,但文件/进程的不同部分,这允许主机系统为每个虚拟系统应用一个内核,这样我可以将进程时间分解为因子4左右。谢谢你的帖子!啊,我(我认为其他人)将这个问题解释为“我有一个很慢的脚本,神奇的多线程按钮在哪里?”。这真是太奇怪了;你怎么称呼他们?谢谢你,下一位