PHP同时触发Web和逻辑

3
我希望将一个网页发送到浏览器,同时在服务器上运行另一个php脚本,而不影响浏览器网页。请问是否可以仅使用php和jquery实现此目的?
注意:我的脚本是一个重任务,我不确定它是否会延迟网页的发送。

2
请记住,通过命令行运行PHP与在Apache中运行PHP是不同的 - PHP可执行文件可能不同,php.ini文件可能不同等。 - DCoder
3个回答

4
我会这样做。
exec("nohup php otherphpscript.php  >/dev/null 2>&1 &");

0

你可以使用curl()在后台访问脚本

<?php
$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, "http://domain.com/script.php?s=email&m=message");
curl_exec ($curl);
curl_close ($curl);

script.php

<?php
// send an email confirming script.php was accessed (with params)
$subject = strip_tags($_GET['s']);
$message = strip_tags($_GET['m']);
mail('email@email.com',$subject,$message);

http://us2.php.net/curl

您也可以在文档加载时通过Ajax异步进行此操作

我不是JavaScript专家,因此可能会有人发现使用Ajax存在问题,但在测试中它对我有效...

<script src="//code.jquery.com/jquery.js"></script>
<script>
$(document).ready(function() {
$.ajax({
    type: 'POST',
    url: 'script.php',
    data: 's=subject&m=message',
    cache: false,
    success: function(data){
        // put success stuff here
        alert(data); // for testing
    }
});
return false;
 });
</script>

script.php

<?php
if($_SERVER['REQUEST_TYPE'] == 'POST') {
    $subject = strip_tags(trim($_POST['s']));
    $message = strip_tags(trim($_POST['m']));

    if(mail('email@email.com',$subject,$message)) {
        echo 'true';
    } else {
        echo 'false';
    }
}

编辑:根据OP在评论中的问题更新了答案。 编辑:添加了ajax示例


1
这种方法的潜在问题是curl_exec是同步的,如果script.php是一个需要更长时间运行的重任务(例如调整图像大小),请求将被阻塞直到它完成。 - Jason Leung
如果操作者无法运行 exec(),请在评论中发表。 - timgavin
True。无论如何,这符合操作者的要求 :) - Jason Leung
可以使用curl传递参数吗? - BLAdam

0

这是可能的。只需ping一下URL:

// 'ping' the url http://localhost/browser/path/to/script2.php
$host = 'localhost';
$path = '/browser/path/to/script2.php';

$fp = fsockopen($host, 80);
if($fp !== false)
{
  $out  = "GET $path HTTP/1.1\r\n";
  $out .= "Host: $host\r\n";
  $out .= "Connection: Close\r\n\r\n";

  fwrite($fp, $out);
  fclose($fp);
}

然后在 script2.php 中:

ignore_user_abort(true);

// your code goes here
// ...

如果脚本是本地的话,开销就会比必要的多得多。 - user557846
没错。每个版本都有其缺点。我喜欢这个版本,因为它适用于所有平台,比curl更轻量级,不依赖用户,并解决了@DCoder的问题。 - lucido-media.de

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接