相关疑难解决方法(0)

PHP中的异步shell exec

我有一个需要调用shell脚本的PHP脚本,但根本不关心输出.shell脚本会进行大量的SOAP调用,并且完成起来很慢,因此我不想在等待回复时减慢PHP请求的速度.实际上,PHP请求应该能够在不终止shell进程的情况下退出.

我已经研究过的各种exec(),shell_exec(),pcntl_fork(),等功能,但他们都不似乎提供正是我想要的.(或者,如果他们这样做,我不清楚如何.)有什么建议吗?

php shell asynchronous

195
推荐指数
9
解决办法
16万
查看次数

提交表单后如何在后台运行PHP脚本?

问题
我有一个表单,在提交时,将运行基本代码来处理提交的信息并将其插入数据库以显示在通知网站上.另外,我有一个已经注册通过电子邮件和短信接收这些通知的人员列表.这个列表是微不足道的(只推动了大约150个),但这足以导致需要花费一分钟才能在整个订阅者表中循环并发送150多封电子邮件.(由于大量的电子邮件策略,电子邮件按照我们的电子邮件服务器的系统管理员的要求单独发送.)

在此期间,发布提醒的个人将在表格的最后一页上停留近一分钟而没有任何正面强化他们的通知被发布.这导致了其他潜在的问题,所有这些问题都有可能我认为不太理想的解决方案.

  1. 首先,海报可能认为服务器滞后并再次单击"提交"按钮,导致脚本重新开始或运行两次.我可以通过使用JavaScript来禁用按钮并将文本替换为"正在处理..."之类的内容来解决这个问题,但这并不理想,因为用户在脚本执行的长度上仍会卡在页面上.(另外,如果禁用JavaScript,则此问题仍然存在.)

  2. 其次,海报可能会在提交表单后过早关闭标签页或浏览器.该脚本将继续在服务器上运行,直到它尝试写回浏览器,但是如果用户随后浏览到我们域中的任何页面(当脚本仍在运行时),则浏览器会挂起加载页面,直到脚本结束.(仅当浏览器的选项卡或窗口关闭而不是整个浏览器应用程序时才会发生这种情况.)但这仍然不太理想.

(可能)解决方案
我已经决定将脚本的"电子邮件"部分分解为一个单独的文件,我可以在发布通知后调用它.我最初想到在通知成功发布后将其放在确认页面上.但是,用户不会知道此脚本正在运行,并且任何异常都不会对他们显而易见; 这个脚本不会失败.

但是,如果我可以将此脚本作为后台进程运行,该怎么办?所以,我的问题是:我如何执行PHP脚本作为后台服务触发并完全独立于用户在表单级别完成的操作?

编辑:不能是cron'ed.它必须在提交表单的瞬间运行.这些是高优先级通知.此外,运行我们服务器的系统管理员不允许运行任何超过5分钟的crons.

php scripting background

97
推荐指数
6
解决办法
13万
查看次数

早点关闭连接

我正在尝试进行AJAX调用(通过JQuery),这将启动一个相当长的过程.我希望脚本只是发送一个响应,表明进程已经启动,但是在PHP脚本运行完毕之前,JQuery不会返回响应.

我用"关闭"标题(下面)尝试了这个,还有输出缓冲; 似乎都不起作用.任何猜测?或者这是我在JQuery中需要做的事情?

<?php

echo( "We'll email you as soon as this is done." );

header( "Connection: Close" );

// do some stuff that will take a while

mail( 'dude@thatplace.com', "okay I'm done", 'Yup, all done.' );

?>
Run Code Online (Sandbox Code Playgroud)

php ajax jquery

96
推荐指数
5
解决办法
6万
查看次数

如何在PHP中创建异步GET请求?

我希望对另一台服务器上的另一个脚本发出一个简单的GET请求.我该怎么做呢?

在一种情况下,我只需要请求外部脚本而无需任何输出.

make_request('http://www.externalsite.com/script1.php?variable=45'); //example usage
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我需要获取文本输出.

$output = make_request('http://www.externalsite.com/script2.php?variable=45');
echo $output; //string output
Run Code Online (Sandbox Code Playgroud)

说实话,我不想乱用CURL,因为这不是CURL的工作.我也不想使用http_get,因为我没有PECL扩展.

fsockopen会工作吗?如果是这样,如何在不读取文件内容的情况下执行此操作?没有其他办法吗?

谢谢大家

更新

我应该补充一下,在第一种情况下,我不想等待脚本返回任何内容.据我所知,file_get_contents()会等待页面完全加载等?

php curl asynchronous http

94
推荐指数
6
解决办法
11万
查看次数

有没有办法在不等待命令完成的情况下使用shell_exec?

我有一个过程密集型任务,我想在后台运行.

用户点击页面,运行PHP脚本,最后,根据某些条件,如果需要,则必须运行shell脚本,EG:

shell_exec('php measurePerformance.php 47 844 email@yahoo.com');
Run Code Online (Sandbox Code Playgroud)

目前我使用shell_exec,但这需要脚本等待输出.有没有办法执行我想要的命令而不等待它完成?

php shell

90
推荐指数
6
解决办法
10万
查看次数

PHP中的并行处理 - 你是如何做到的?

我目前正在尝试在php中实现一个作业队列.然后,队列将作为批处理作业处理,并且应该能够并行处理某些作业.

我已经做了一些研究并找到了几种方法来实现它,但我并没有真正意识到它们的优点和缺点.

例如,通过多次调用脚本来执行并行处理,fsockopen如下所述:
PHP中的简单并行处理

我找到的另一种方法是使用这些curl_multi功能.
curl_multi_exec PHP文档

但我认为这两种方式会增加相当多的开销,在队列上创建批处理应该主要在后台运行吗?

我也读到了关于pcntl_fork这似乎也是一种处理问题的方法.但是如果你真的不知道自己在做什么(就像我现在这样;),那看起来就会变得非常混乱.)

我也看了一下Gearman,但在那里我还需要根据需要动态生成工作线程,而不是只运行一些,然后让gearman作业服务器将它发送给自由工作者.特别是因为线程应该在执行一个作业后干净利落地退出,不会遇到最终的内存泄漏(在该问题中代码可能不完美).
Gearman入门

所以我的问题是,你如何处理PHP中的并行处理?为什么选择你的方法,不同的方法有哪些优点/缺点?

感谢您的任何意见.

php parallel-processing multithreading task-queue

34
推荐指数
3
解决办法
4万
查看次数

PHP exec()作为后台进程(Windows Wampserver环境)

我正在尝试设置一个将触发后台进程的php触发器文件.(见这个问题)

我在Windows Wampserver环境中这样做.

所以例如我有trigger.php运行exec函数,该函数调用我的backgroundProcess.php解析和执行.

但问题是我的trigger.php文件正在等待exec()命令backgroundProcess.php在停止之前完成运行.后台进程运行大约20-30秒,并且trigger.php一直等待,直到backgroundProcess.php完全结束.

这有道理吗?这是trigger.php运行exec()命令的文件

exec('C:\wamp\bin\php\php'.phpversion().'\php.exe -f C:\path\to\backgroundProcess.php > C:\wamp\bin\php\php'.phpversion().'\dev\null &');
Run Code Online (Sandbox Code Playgroud)

基本上,我trigger.php只想触发backgroundProcess而不是等待它完成.


编辑

使用以下命令解决问题:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
Run Code Online (Sandbox Code Playgroud)

php exec background-process

25
推荐指数
2
解决办法
3万
查看次数

如何从PHP获取PHP BIN的路径?

如何从PHP获取php的bin路径?我在phpinfo()中看到过它; 但我需要另一种方法在Linux和Windows系统中获取它.

php path bin

18
推荐指数
4
解决办法
4万
查看次数

shell_exec无需等待输出

可能重复:
PHP中的异步shell exec
有没有办法在不等待命令完成的情况下使用shell_exec?

我想运行一个非常慢/复杂的程序,至少需要10分钟才能完成.我想通过shell_exec或类似的东西来调用它,但我不希望php脚本等待这个程序的完成.

是我可以做的事情?如果是这样我怎么能这样做?

php

10
推荐指数
1
解决办法
2万
查看次数

从php启动phantomjs服务器并等待它的响应

我想从我的php脚本运行一个phantomjs服务器,然后对它进行curl请求并读取它的响应(在最终版本中将给出生成pdf的路径).从控制台运行phantomjs服务器文件,然后在浏览器中导航到它的地址时,一切正常.这是server.js文件:

var server, service, page = require('webpage').create(), address, output,
    html = '<!DOCTYPE><html><head></head><body><h1>FOOO</h1></body></html>';

server = require('webserver').create();

var rasterize = function(html, callback){
    address = 'http://localhost';
    output = '/Users/me/print.pdf'
    page.viewportSize = { width: 600, height: 600 };
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
        } else {
            window.setTimeout(function () {
                page.content = html;
                page.render(output);
                callback();
            }, 2000);
        }
    });
}

service = server.listen(8080, function (request, response) {
    response.statusCode = 200;

    rasterize(html, function(){
        response.write('<h1>BAR</h1>');
        response.close();
        phantom.exit();     
    }); …
Run Code Online (Sandbox Code Playgroud)

javascript php shell curl phantomjs

8
推荐指数
1
解决办法
8532
查看次数