Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP代码文件在shell中运行_Php_Shell - Fatal编程技术网

PHP代码文件在shell中运行

PHP代码文件在shell中运行,php,shell,Php,Shell,我有非常沉重的PHP代码文件,它可以在200000条记录上创建PDF。PDF页面总数将高达150000页。我试图通过浏览器运行我的代码,但它无法做到这一点。我想我必须通过shell运行它,或者有人能建议其他方法吗?如果您希望PHP脚本将其调用到shell中,那么: exec("php path/to/script.php&"); 否则,只需从终端执行引号中的操作 另外,检查php.ini文件,它可能会在一定时间后设置为超时。那可能是你的问题。如果是这样的话,你最好把

我有非常沉重的PHP代码文件,它可以在200000条记录上创建PDF。PDF页面总数将高达150000页。我试图通过浏览器运行我的代码,但它无法做到这一点。我想我必须通过shell运行它,或者有人能建议其他方法吗?

如果您希望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 $!");
where命令是您要执行的操作

然后是一些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>

$(文档).ready(函数()
{
检查状态();
});
函数checkSatus()
{
$.get(“/path/to/checkStatus.php,{pid:},function(){
如果(data.running==1)警报(“PDF完成”);
设置超时(检查状态,30000);
}
然后是另一个checkStatus.php文件:

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

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

exec("php path/to/script.php&");
否则,只需从终端执行引号中的操作

也可以检查你的phpini文件,在一定的时间之后,它可能被设置为超时。这可能是你的问题。如果是这样,你最好把它交给一个用C语言或C++语言编写的程序,然后再把它交给PHP。你也可以把超时值提高到一个较高的值,但是如果它花费太长时间。可能会使您的服务器陷入困境

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

更新: 大概是这样的:

$pid = exec("nohup $command > /dev/null 2>&1 & echo $!");
where命令是您要执行的操作

然后是一些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>

$(文档).ready(函数()
{
检查状态();
});
函数checkSatus()
{
$.get(“/path/to/checkStatus.php,{pid:},function(){
如果(data.running==1)警报(“PDF完成”);
设置超时(检查状态,30000);
}
然后是另一个checkStatus.php文件:

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

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

    你需要考虑减少PDF—150000页的大小对于PDF来说太大了。把它分成多个报告
  • 这应该在专用服务器上的后台创建。如何创建以及多久创建一次,取决于运行所需的时间和数据的新鲜程度
  • 如前所述,您可以使用
    cron
    ,也可以使用RabbitMQ或Gearman之类的排队系统,这两种系统都可以从PHP访问。然而,一个合适的排队系统确实比一个简单的计划脚本具有更陡峭的学习曲线
  • 你应该愿意对这个问题做一些研究。你对“请详细说明”的回答和任何有解决方案的人都表明,你相信在这里会为你编写一个完整的代码解决方案-这不是StackOverflow的工作方式。只有你知道你的情况的全部细节,你需要从不同的人那里得到建议在这里学习,并将它们与额外的研究一起应用,以得到一个有效的解决方案

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

        你需要考虑减少PDF—150000页的大小对于PDF来说太大了。把它分成多个报告
      • 这应该在专用服务器上的后台创建。如何创建以及多久创建一次,取决于运行所需的时间和数据的新鲜程度
      • 如前所述,您可以使用
        cron
        ,也可以使用RabbitMQ或Gearman之类的排队系统,这两种系统都可以从PHP访问。然而,一个合适的排队系统确实比一个简单的计划脚本具有更陡峭的学习曲线
      • 你应该愿意对这个问题做一些研究。你对“请详细说明”的回答和任何有解决方案的人都表明,你相信在这里会为你编写一个完整的代码解决方案-这不是StackOverflow的工作方式。只有你知道你的情况的全部细节,你需要从不同的人那里得到建议在这里学习,并将它们与额外的研究一起应用,以得到一个有效的解决方案

      Travis man,你的解决方案吸引了我,但我完全不知道如何实施it@Strom伙计,你只需要将脚本中的内容放入HTML中进行检查。有一个更好的解决方案,但我想从脚本中获取$pid。只需从希望看到返回的位置启动$pid。确保$command是ike“php/path/to”复制CalthStasu.php,然后更改Ajax中的URL,如果我没有犯任何语法错误,它应该工作。把它传递给C或C++会更难,我不知道该怎么做,但是一些研究可能会有帮助。所以看看它是否通过shell,仍然有PHP的作用。我会尽力帮忙的,除此之外,这是我所知道的,不需要亲自编写代码。Travis man,你的解决方案吸引了我,但我完全不知道如何实现it@Strom伙计,你只需要把脚本中的内容放到HTML中,然后检查它。有一个更好的解决方案,但我想从脚本中得到$pid。只需从您希望看到返回的位置启动$pid即可。请确保$command类似于“php/path/to”复制checkStatus.php,然后在ajax中更改URL,它应该可以正常工作