提升Apache2最高4核心使用率,运行PHP


在CLI上进一步阅读,了解CLI问题,只需添加到交谈中!谢谢!


我已经编写了一个脚本,用于处理大约160'000个条目的xml文件(48.1MB)和一个150'000条目的文本文件(31.1MB),包括一些目录搜索外部文件,重链接和递归检查以及结果格式化全部保存到html文件中。

当然,我确实多次审查了这个程序,最终得到了我能想到的最有效的代码。这是一个本地程序,生成器不需要定期运行。有人可能会说我应该使用除PHP以外的其他语言,但是使用simplexml等的PHP对我和这个目的来说都是最好的。另外一个set_time_limit('70000')不会打扰我。

虽然,在这里我的问题是,是否可以在我的Linux系统上创建apache2,使用我的4个CPU核心运行我的PHP脚本? 即使我拆分进程并同时发出多个请求,CPU使用率也不能一次超过1个CPU。

我GOOGLE了这个主题,但无法找到解决方案,所以我可能只需要运行它一整夜,即使,我会感谢一些帮助,以提高这个事情!

ADDED INFO - And here a picture of my processes: enter image description here

CLI: 我需要在linux终端中调用我的index.php来执行。但是我也想发送四个post变量($ _POST ['example'])给脚本。最重要的是,我正在寻找在某些输出文件中出现回声的问题。任何人都可以用终端命令和php命令快速帮助追踪这4个变量:

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

? ...对不起,但这是我第一次使用php-cli进行交互。谢谢!

0
额外 编辑
意见: 1
不可能:哎呀!您的答案无法提交,因为:声誉低于100的用户在询问后8小时内无法回答自己的问题。你可以在4个小时内自行回答。在此之前请使用评论,或者编辑您的问题。
额外 作者 systrue,
set_time_limit(0)会比将其设置为某个任意高的数字更好。
额外 作者 ThiefMaster,
如果您将问题留作问题并发布如何解决问题作为答案,对每个人来说都会更清楚。
额外 作者 Zombaya,

4 答案

SOLUTION, THX TO ThiefMaster and Zebediah49 recommending cli and my friend who supported me with the links: http://ch.php.net/manual/en/reserved.variables.argv.php/http://ch.php.net/manual/en/function.getopt.php

在这里,我如何通过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];
}

and the Result of calling the PHP file in three terminals: enter image description here

我知道,我必须给我的虚拟机增加更多内存,幸运的是我仍然有8GB的备用空间;-)

欢呼与和平!

0
额外

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

取决于你做的事情依赖于多少,你无法轻易地将它们分成多个线程。

0
额外
会给它一个镜头......你有关于使用cli的好资源吗?我在一个设置屏幕上发布了一些变量,并且在我查看php.net上的cli描述后不知道该怎么做。也许我太懒,不能仔细阅读,但你知道这是怎么回事,如果我能找到一本更好的手册,thx!
额外 作者 systrue,
我应该运行哪些PHP环境? xamp(apache for win)不会改进它以太...
额外 作者 systrue,
我尝试过,但即使有几个请求,我的apache仍然只使用一个cpu。也许我可以改进我的配置?我的意思是我的apache在其他请求中使用了超过1个cpu,但不是在这个特定的php文件/编程中。
额外 作者 systrue,
这不是一个解决方案,而是一个很好的解决方法。我用linux/apache2安装克隆我的虚拟机,以启动相同的进程,但在不同虚拟机上启动文件/进程的不同部分,从而让主机系统为每个虚拟系统应用一个内核,这样我就可以分解进程时间周围的因素4.感谢您的帖子!
额外 作者 systrue,
是的,正是我期望的答案,但值得一问!谢谢!
额外 作者 systrue,
为什么不简单地运行多个PHP进程?这将少得多。
额外 作者 ThiefMaster,
为什么你使用apache呢?
额外 作者 ThiefMaster,
当然是php-cli(commandline)。
额外 作者 ThiefMaster,

编辑:作者的回应

这不是一个解决方案,而是一个很好的解决方法。我用linux/apache2安装克隆我的虚拟机,以启动相同的进程,但在不同虚拟机上启动文件/进程的不同部分,从而让主机系统为每个虚拟系统应用一个内核,这样我就可以分解进程时间周围的因素4.感谢您的帖子!

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

如果它是本地的,并且你想不时地运行它,你应该从 cron 作业调用它。这样,您可以为您正在进行的每项任务创建一个流程。如果你真的想使用PHP,你甚至可以调用PHP从cron行来完成。

无论如何,这听起来像是你在做一个固有的单线程的过程,如果你希望它更快,应该使用非PHP的东西。

0
额外
有你们,我要去尝试cli。还没有使用过,我需要处理脚本的一些发布变量,这通常是我在浏览器中设置的。我的意思是命令行很简单,只是发布我需要阅读一些手册的命令。也许你有一个很好的资源?
额外 作者 systrue,
我不会通过cli呼叫他们,但Firefox或其他浏览器。我从多个请求的外部从apache vm内测试它。只需定义写入函数即可在某些行开始。所以我打电话要求做一个0-60000,第二个60000-120000和第三个120000结束。好像是apache推迟了第一个完成的第二个和第三个请求。
额外 作者 systrue,
看到我上面的更改问题! CLI为我解决了问题!谢谢
额外 作者 systrue,
这就是我的问题,我已经这样做了,由于某些原因,我的虚拟机仍然只使用一个CPU核心进行多次调用。我不知道为什么?
额外 作者 systrue,
这不是一个解决方案,而是一个很好的解决方法。我用linux/apache2安装克隆我的虚拟机,以启动相同的进程,但在不同虚拟机上启动文件/进程的不同部分,从而让主机系统为每个虚拟系统应用一个内核,这样我就可以分解进程时间周围的因素4.感谢您的帖子!
额外 作者 systrue,
该死的,没有足够的声誉来回答我自己的问题,所以这里是:
额外 作者 systrue,
是的,一个CPU核心始终在100%的使用率上。目录搜索是一项小任务。虽然,谢谢......我认为这是一种明智的方式,但看起来IO界很明显。我也有这个解决方法...阅读我的答案!
额外 作者 systrue,
是的,cron就是我用来运行这些东西的东西。似乎我不需要一个i7-2600 CPU,但有一个不好的屁股快速uni核心CPU。感谢您的快速回答!
额外 作者 systrue,
这是有道理的;它可能是链接请求(而不是重载服务器,每个客户端一次返回一个请求)。拆分“服务器”意味着firefox认为它是不同的服务器,并且apache进程实际上是不同的服务器。如果你直接从cli调用解析器的话,我会非常好奇它是否做了同样的事情。
额外 作者 zebediah49,
嗯,我(我认为其他人)把这个问题解释为“我的脚本很慢,那个神奇的多线程按钮在哪里?”。尽管这很奇怪,你怎么打电话给他们?
额外 作者 zebediah49,
如果你可以把它分成不同的虚拟机中的不同部分,为什么你不能把它分成同一个虚拟机上的不同部分,只是在每个部分多次调用它?
额外 作者 zebediah49,
嘿,如果目前没有更好的做法,i7将会变成单核心:P。无论如何,你可以通过分解它来对它进行多线程处理。例如,它“目录搜索外部文件”听起来像有 find/wherever /> /somewhere/listOfFiles.txt ,提前运行,然后搜索该索引文件或类似的东西。这听起来像是你可能比其他任何东西都更受IO限制。你确定你实际上最大化了一个proc核心吗?
额外 作者 zebediah49,

也许你可以使用Spork!这是一个php lib,允许你将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!
});

https://github.com/kriswallsmith/spork

0
额外
谢谢,下次我要试试这个,我已经分解了这个过程,所以现在它不会真的改变我脚本中的任何内容
额外 作者 systrue,
我不知道这个库的存在是否给我留下了深刻的印象或者震惊......在某些情况下,它看起来非常有用。
额外 作者 zebediah49,