0

我有非常重的 PHP 代码文件,它在 200,000 条记录上创建 PDF。PDF 页面的总数将高达 150,000。我尝试通过浏览器运行我的代码,但它无法做到这一点。我想我必须通过 shell 运行它 - 或者任何人都可以提出替代方法吗?

4

2 回答 2

4

如果您希望 PHP 脚本将其调用到 shell 中,则:

exec("php path/to/script.php&");

否则,只需执行终端引号中的内容即可。

此外,检查您的 php.ini 文件,它可能会在一定时间后设置为超时。那可能是你的问题。如果是这种情况,最好将其交给用 C 或 C++ 等低级语言编写的程序,然后再交给 PHP。您也可以将 timout 增加到更高的值,但如果花费的时间太长,它可能会使您的服务器陷入困境。

如果您想在浏览器中看到它何时完成。确保您可以获取进程的 pid,然后创建一个脚本来查看进程的状态。完成后让 AJAX 将其加载到当前帧中。

更新:

像这样的东西:

$pid = exec("nohup $command > /dev/null 2>&1 & echo $!");

其中命令是你想要做的。

然后像一些jquery:

<script>
$(document).ready(function()
{
   checkStatus();
});

function checkSatus()
{
   $.get("/path/to/checkStatus.php,{pid: <?php echo $pid;?>},function(){
     if(data.running == 1) alert("PDFS done");
   window.setTimeOut(checkStatus,30000);
}
</script>

然后是另一个 checkStatus.php 文件:

<?php
  $pid = $_GET["pid"];
  $isRunning = file_exists( "/proc/$pid" );
  if($isRunning){
    json_encode(Array("running"=>1));
  }
  else
  {
    json_encode(Array("running"=>0));
  }

*不保证代码。它很快就放在一起了。

于 2012-08-01T16:43:45.300 回答
0

一些想法可能太大而无法发表评论:

  • 您需要考虑减小此 PDF 的大小 - 150,000 页对于 PDF 来说太大了。将其拆分为多个报告
  • 这应该在您的专用服务器的后台创建。您如何执行此操作以及执行频率取决于运行所需的时间以及您需要数据的新鲜程度
  • 您可以使用cron,如前所述,或者像 RabbitMQ 或 Gearman 这样的排队系统 - 两者都可以从 PHP 访问。然而,一个合适的队列系统确实比一个简单的预定脚本具有更陡峭的学习曲线。
  • 你应该愿意对这个问题做一些研究。您的回复请详细说明任何有解决方案的人都建议您相信这里会为您编写完整的代码解决方案 - 这不是 StackOverflow 的工作方式。只有你知道你的情况的全部细节,你需要从这里的不同人那里得到指示,并应用它们 - 连同额外的研究 - 以获得一个可行的解决方案。
于 2012-08-01T16:57:02.243 回答