如何在PHP中发出异步GET请求?


97

我希望对其他服务器上的另一个脚本进行简单的GET请求。我该怎么做呢?

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

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

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

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

老实说,我不想弄乱CURL,因为这实际上不是CURL的工作。我也不想使用http_get,因为我没有PECL扩展名。

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

谢谢大家

更新资料

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


6
@威廉:是的,大多数问题都可以看作是它们的重复。8-)我认为您发布了错误的链接...
RichieHindle


1
我的意思是发布链接musicfreak,混合我的标签;-)
William Brendel

2
@Richie:大多数问题吗?;)
Sasha Chedygov 2009年

1
我重新命名了这个问题,以区别于其他问题,因为您似乎想发出一个请求,而不在乎使用响应(因此在其余脚本运行时可能会发生)。如果我弄错了,请还原它!
DBR

Answers:


52

file_get_contents 会做你想要的

$output = file_get_contents('http://www.example.com/');
echo $output;

编辑:一种触发GET请求并立即返回的方法。

引用自http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html

function curl_post_async($url, $params)
{
    foreach ($params as $key => &$val) {
      if (is_array($val)) $val = implode(',', $val);
        $post_params[] = $key.'='.urlencode($val);
    }
    $post_string = implode('&', $post_params);

    $parts=parse_url($url);

    $fp = fsockopen($parts['host'],
        isset($parts['port'])?$parts['port']:80,
        $errno, $errstr, 30);

    $out = "POST ".$parts['path']." HTTP/1.1\r\n";
    $out.= "Host: ".$parts['host']."\r\n";
    $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
    $out.= "Content-Length: ".strlen($post_string)."\r\n";
    $out.= "Connection: Close\r\n\r\n";
    if (isset($post_string)) $out.= $post_string;

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

这是打开一个套接字,触发一个get请求,然后立即关闭该套接字并返回。


6
curl_post_async发送POST请求,而不是GET。
Vinko Vrsalovic

13
我说这个函数的名称不正确是对的吗?它确实与curl库没有任何关系。它更像是fsock_post_async()
MikeMurko

61
这不是异步的!特别是如果另一侧的服务器关闭,则这段代码将挂起30秒(fsockopen中的第5个参数)。同样,fwrite将花费其甜蜜的时间来执行(您可以用stream_set_timeout($ fp,$ my_timeout)进行限制。最好的办法是将fsockopen的低超时设置为0.1(100ms),将$ my_timeout设置为100ms但是,您可能会冒风险,因为请求超时
Chris Cinelli 2012年

4
这与异步无关。这就是同步的方式...异步意味着在此任务完成时执行其他任务。它是并行执行。
CodeAngry

17
这既不是异步的,也不是使用curl,您怎么敢称呼它curl_post_async甚至获得投票...
Daniel W.

33

这是使Marquis的答案同时适用于POST和GET请求的方法:

  // $type must equal 'GET' or 'POST'
  function curl_request_async($url, $params, $type='POST')
  {
      foreach ($params as $key => &$val) {
        if (is_array($val)) $val = implode(',', $val);
        $post_params[] = $key.'='.urlencode($val);
      }
      $post_string = implode('&', $post_params);

      $parts=parse_url($url);

      $fp = fsockopen($parts['host'],
          isset($parts['port'])?$parts['port']:80,
          $errno, $errstr, 30);

      // Data goes in the path for a GET request
      if('GET' == $type) $parts['path'] .= '?'.$post_string;

      $out = "$type ".$parts['path']." HTTP/1.1\r\n";
      $out.= "Host: ".$parts['host']."\r\n";
      $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
      $out.= "Content-Length: ".strlen($post_string)."\r\n";
      $out.= "Connection: Close\r\n\r\n";
      // Data goes in the request body for a POST request
      if ('POST' == $type && isset($post_string)) $out.= $post_string;

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

2
这是一个方便的代码段,我在这里和那里一直在使用它,但是现在我发现我需要做同样的事情,但是要使用SSL站点。除了HTTP / 1.1类型和端口外,我还需要更改什么吗?
Kevin Jhangiani 2011年

2
在回答有关将此问题用于SSL的问题时,可以通过将端口更改为443并将ssl://附加到fsockopen中的端口名称来使其成为SSL:$ fp = fsockopen(“ ssl://”。$ parts ['host '],
Michael Dogger

1
“除了HTTP / 1.1类型和端口之外,我还需要更改什么吗?” -是的,您应该使用主机名ssl://hostname而不是just来调用fsockopen()hostname
Cowlby

22
这不是异步的!特别是如果另一侧的服务器关闭,则这段代码将挂起30秒(fsockopen中的第5个参数)。同样,fwrite将花费其甜蜜的时间来执行(您可以用stream_set_timeout($ fp,$ my_timeout)进行限制。最好的办法是将fsockopen的低超时设置为0.1(100ms),将$ my_timeout设置为100ms但是,您可能会冒风险,因为请求超时
Chris Cinelli 2012年

1
不应为GET设置Content-Length。也许在某些情况下不会导致错误,但是在我的情况下,导致请求未被调用的php脚本处理。
user3285954

13

关于您的更新,关于不想等待整个页面加载-我认为HEAD您正在寻找HTTP 请求。

get_headers应该这样做-我认为它只请求标头,因此不会发送完整的页面内容。

“ PHP / Curl:HEAD请求在某些站点上花费很长时间”描述了如何HEAD使用PHP / Curl 进行请求

如果要触发请求,而根本不保留脚本,则有几种方法,它们的复杂程度各不相同。

  • 将HTTP请求作为后台进程执行php执行后台进程 -基本上,您将执行类似的操作"wget -O /dev/null $carefully_escaped_url"-这将是特定于平台的,并且在转义命令参数时必须非常小心
  • 在后台执行PHP脚本 -与UNIX处理方法基本相同,但是执行PHP脚本而不是Shell命令
  • 使用数据库(或类似beantalk的东西,可能会导致过大杀伤力)来创建一个“工作队列” 。您将URL添加到队列中,并且后台进程或cron-job定期检查新任务并对该URL执行请求

+1为我以前没有想到的各种有趣选项
Jasdeep Khalsa

“我认为它只请求标头”-也许,但是没有什么可以阻止文档发送完整的响应正文以响应HEAD请求。我认为这种方法将在内部使用fsock并强制其等待(并读取)完整响应。
hiburn8

6

你不知道 虽然PHP提供了许多调用URL的方法,但它不提供对每个请求/执行周期进行任何类型的异步/线程处理的即开即用支持。任何发送URL请求(或SQL语句等)的方法都将等待某种形式的响应。您需要在本地计算机上运行某种辅助系统来实现此目标(谷歌搜索“ php作业队列”)


1
这里有一个hack:stackoverflow.com/questions/124462/asynchronous-php-calls(克里斯蒂安·达文(ChristianDavén)的回答),但是我同意队列是正确的方法。
克里斯·

我认为2009年的答案现在已经过时。该狂饮PHP库现在已经做并发和异步请求的支持。
西蒙·伊斯特

6

我会推荐您经过良好测试的PHP库:curl-easy

<?php
$request = new cURL\Request('http://www.externalsite.com/script2.php?variable=45');
$request->getOptions()
    ->set(CURLOPT_TIMEOUT, 5)
    ->set(CURLOPT_RETURNTRANSFER, true);

// add callback when the request will be completed
$request->addListener('complete', function (cURL\Event $event) {
    $response = $event->response;
    $content = $response->getContent();
    echo $content;
});

while ($request->socketPerform()) {
    // do anything else when the request is processed
}

狂饮PHP库也有做并发和异步请求的支持。
西蒙·伊斯特

Guzzle声称它有支持,但是测试它的postAsync方法看起来像它同步进行150 ms,然后异步进行2 ms。我花了一个多小时试图修复它,但没有成功-不会推荐它。
Velizar Hristov

4

如果使用Linux环境,则可以使用PHP的exec命令来调用linux curl。这是一个示例代码,它将发出一个异步HTTP帖子。

function _async_http_post($url, $json_string) {
  $run = "curl -X POST -H 'Content-Type: application/json'";
  $run.= " -d '" .$json_string. "' " . "'" . $url . "'";
  $run.= " > /dev/null 2>&1 &";
  exec($run, $output, $exit);
  return $exit == 0;
}

该代码不需要任何额外的PHP库,并且可以在不到10毫秒的时间内完成http发布。


1
这是一个非常糟糕的主意:高管失败很多:想象一下6/200客户将不会收到付费预订的电子邮件确认...
HellBaby 2015年

就我而言,这对我很有用,因为我只需要ping即可在另一台服务器上启动另一个脚本。我只是这样使用它:_async_http_post($ url,''); 这正在OVH互斥服务器上工作……太好了。
Kilowog

4
function make_request($url, $waitResult=true){
    $cmi = curl_multi_init();

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($cmi, $curl);

    $running = null;
    do {
        curl_multi_exec($cmi, $running);
        sleep(.1);
        if(!$waitResult)
        break;
    } while ($running > 0);
    curl_multi_remove_handle($cmi, $curl);
    if($waitResult){
        $curlInfos = curl_getinfo($curl);
        if((int) $curlInfos['http_code'] == 200){
            curl_multi_close($cmi);
            return curl_multi_getcontent($curl);
        }
    }
    curl_multi_close($cmi);
}

您可以让它返回一个对象,让您调用getstatus()waitSend()waitResult()。这样,调用方可以通过循环调用以检查是否有结果,从而获得完全异步的行为,如果没有,则继续执行其他正在运行的任务。嗯,现在我Task要从.net 移植到php…
binki 2016年

3

有趣的问题。我猜您只是想在另一台服务器上触发一些过程或动作,但是不在乎结果是什么,并希望脚本继续。cURL中可能有些东西可以使这种情况发生,但是exec()如果cURL无法做到,则您可能要考虑使用来在执行调用的服务器上运行另一个脚本。(通常人们希望脚本调用的结果,因此我不确定PHP是否能够触发该过程。)使用exec()您可以运行一个wget甚至一个使用发出请求的PHP脚本file_get_conents()


2

您最好考虑使用消息队列而不是建议的方法。我敢肯定这将是一个更好的解决方案,尽管它比发送请求所需要的工作还要多。


2

让我告诉你我的方式:)

需要在服务器上安装nodejs

(我的服务器发送1000 https get请求仅需2秒)

url.php:

<?
$urls = array_fill(0, 100, 'http://google.com/blank.html');

function execinbackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
} 
fwite(fopen("urls.txt","w"),implode("\n",$urls);
execinbackground("nodejs urlscript.js urls.txt");
// { do your work while get requests being executed.. }
?>

urlscript.js>

var https = require('https');
var url = require('url');
var http = require('http');
var fs = require('fs');
var dosya = process.argv[2];
var logdosya = 'log.txt';
var count=0;
http.globalAgent.maxSockets = 300;
https.globalAgent.maxSockets = 300;

setTimeout(timeout,100000); // maximum execution time (in ms)

function trim(string) {
    return string.replace(/^\s*|\s*$/g, '')
}

fs.readFile(process.argv[2], 'utf8', function (err, data) {
    if (err) {
        throw err;
    }
    parcala(data);
});

function parcala(data) {
    var data = data.split("\n");
    count=''+data.length+'-'+data[1];
    data.forEach(function (d) {
        req(trim(d));
    });
    /*
    fs.unlink(dosya, function d() {
        console.log('<%s> file deleted', dosya);
    });
    */
}


function req(link) {
    var linkinfo = url.parse(link);
    if (linkinfo.protocol == 'https:') {
        var options = {
        host: linkinfo.host,
        port: 443,
        path: linkinfo.path,
        method: 'GET'
    };
https.get(options, function(res) {res.on('data', function(d) {});}).on('error', function(e) {console.error(e);});
    } else {
    var options = {
        host: linkinfo.host,
        port: 80,
        path: linkinfo.path,
        method: 'GET'
    };        
http.get(options, function(res) {res.on('data', function(d) {});}).on('error', function(e) {console.error(e);});
    }
}


process.on('exit', onExit);

function onExit() {
    log();
}

function timeout()
{
console.log("i am too far gone");process.exit();
}

function log() 
{
    var fd = fs.openSync(logdosya, 'a+');
    fs.writeSync(fd, dosya + '-'+count+'\n');
    fs.closeSync(fd);
}

1
这不是纯PHP解决方案。
宾基

2

对我来说,出现异步GET请求的问题是因为我遇到了这样的情况:我需要执行数百个请求,获取和处理每个请求的结果数据,并且每个请求花费大量的毫秒执行时间,导致几分钟(!)总体执行简单file_get_contents

在这种情况下,对于函数http://php.net/manual/en/function.curl-multi-init.php上php.net 的w_haigh注释非常有用。

因此,这是我同时进行大量请求的升级和清理版本。就我而言,这相当于“异步”方式。可能对某人有帮助!

// Build the multi-curl handle, adding both $ch
$mh = curl_multi_init();

// Build the individual requests, but do not execute them
$chs = [];
$chs['ID0001'] = curl_init('http://webservice.example.com/?method=say&word=Hello');
$chs['ID0002'] = curl_init('http://webservice.example.com/?method=say&word=World');
// $chs[] = ...
foreach ($chs as $ch) {
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,  // Return requested content as string
        CURLOPT_HEADER => false,         // Don't save returned headers to result
        CURLOPT_CONNECTTIMEOUT => 10,    // Max seconds wait for connect
        CURLOPT_TIMEOUT => 20,           // Max seconds on all of request
        CURLOPT_USERAGENT => 'Robot YetAnotherRobo 1.0',
    ]);

    // Well, with a little more of code you can use POST queries too
    // Also, useful options above can be  CURLOPT_SSL_VERIFYHOST => 0  
    // and  CURLOPT_SSL_VERIFYPEER => false ...

    // Add every $ch to the multi-curl handle
    curl_multi_add_handle($mh, $ch);
}

// Execute all of queries simultaneously, and continue when ALL OF THEM are complete
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running);

// Close the handles
foreach ($chs as $ch) {
    curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);

// All of our requests are done, we can now access the results
// With a help of ids we can understand what response was given
// on every concrete our request
$responses = [];
foreach ($chs as $id => $ch) {
    $responses[$id] = curl_multi_getcontent($ch);
    curl_close($ch);
}
unset($chs); // Finita, no more need any curls :-)

print_r($responses); // output results

很容易将其重写以处理POST或其他类型的HTTP(S)请求或它们的任何组合。和Cookie支持,重定向,http-auth等。


哦..我看到这个问题是在2009年创建的,我在2016年写下了我的答案:)但是我们很多人google php都变得异步了,来到了这里。
FlameStorm

是的,我在谷歌搜索时也来到了这里。一些编码人员可能还希望研究Guzzle PHP库,该支持执行并发和异步请求。
西蒙·伊斯特

1

尝试:

//Your Code here
$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
}
else if ($pid)
{
echo("Bye")  
}
else
{
     //Do Post Processing
}

这将无法用作apache模块,您需要使用CGI。


1

我发现这个有趣的链接可以进行异步处理(获取请求)。

阿卡帕奇

此外,您可以通过使用消息队列(例如beantalkd)来进行异步处理。


1

这是用于执行简单GET请求的已接受答案的改编。

要注意的一件事是,如果服务器进行任何URL重写,则此操作将无效。您需要使用功能更全的http客户端。

  /**
   * Performs an async get request (doesn't wait for response)
   * Note: One limitation of this approach is it will not work if server does any URL rewriting
   */
  function async_get($url)
  {
      $parts=parse_url($url);

      $fp = fsockopen($parts['host'],
          isset($parts['port'])?$parts['port']:80,
          $errno, $errstr, 30);

      $out = "GET ".$parts['path']." HTTP/1.1\r\n";
      $out.= "Host: ".$parts['host']."\r\n";
      $out.= "Connection: Close\r\n\r\n";
      fwrite($fp, $out);
      fclose($fp);
  }

1

对上面发布的脚本进行了一些更正。以下为我工作

function curl_request_async($url, $params, $type='GET')
    {
        $post_params = array();
        foreach ($params as $key => &$val) {
            if (is_array($val)) $val = implode(',', $val);
            $post_params[] = $key.'='.urlencode($val);
        }
        $post_string = implode('&', $post_params);

        $parts=parse_url($url);
        echo print_r($parts, TRUE);
        $fp = fsockopen($parts['host'],
            (isset($parts['scheme']) && $parts['scheme'] == 'https')? 443 : 80,
            $errno, $errstr, 30);

        $out = "$type ".$parts['path'] . (isset($parts['query']) ? '?'.$parts['query'] : '') ." HTTP/1.1\r\n";
        $out.= "Host: ".$parts['host']."\r\n";
        $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
        $out.= "Content-Length: ".strlen($post_string)."\r\n";
        $out.= "Connection: Close\r\n\r\n";
        // Data goes in the request body for a POST request
        if ('POST' == $type && isset($post_string)) $out.= $post_string;
        fwrite($fp, $out);
        fclose($fp);
    }

我有一个问题,其中fwrite返回一个正数的字节,但脚本端点未调用(未记录)..仅当我使用时它才起作用:while(!feof($ fp)){fgets($ fp ,128); }
Miguel 2015年

1

似乎没有人提到Guzzle,这是一个PHP HTTP客户端,可以轻松发送HTTP请求。它可以与或不与Curl。它可以发送同步和异步请求。

$client = new GuzzleHttp\Client();
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(
    function (ResponseInterface $res) {
        echo $res->getStatusCode() . "\n";
    },
    function (RequestException $e) {
        echo $e->getMessage() . "\n";
        echo $e->getRequest()->getMethod();
    }
);

是的,该主题中的许多答案都已经很老了,但是Guzzle绝对是我在2018年遇到的最好的选择,感谢发布。
西蒙·伊斯特

0

基于此线程,我将其用于我的codeigniter项目。它工作正常。您可以在后台处理任何功能。

接受异步调用的控制器。

class Daemon extends CI_Controller
{
    // Remember to disable CI's csrf-checks for this controller

    function index( )
    {
        ignore_user_abort( 1 );
        try
        {
            if ( strcmp( $_SERVER['REMOTE_ADDR'], $_SERVER['SERVER_ADDR'] ) != 0 && !in_array( $_SERVER['REMOTE_ADDR'], $this->config->item( 'proxy_ips' ) ) )
            {
                log_message( "error", "Daemon called from untrusted IP-address: " . $_SERVER['REMOTE_ADDR'] );
                show_404( '/daemon' );
                return;
            }

            $this->load->library( 'encrypt' );
            $params = unserialize( urldecode( $this->encrypt->decode( $_POST['data'] ) ) );
            unset( $_POST );
            $model = array_shift( $params );
            $method = array_shift( $params );
            $this->load->model( $model );
            if ( call_user_func_array( array( $this->$model, $method ), $params ) === FALSE )
            {
                log_message( "error", "Daemon could not call: " . $model . "::" . $method . "()" );
            }
        }
        catch(Exception $e)
        {
            log_message( "error", "Daemon has error: " . $e->getMessage( ) . $e->getFile( ) . $e->getLine( ) );
        }
    }
}

还有一个执行异步调用的库

class Daemon
{
    public function execute_background( /* model, method, params */ )
    {
        $ci = &get_instance( );
        // The callback URL (its ourselves)
        $parts = parse_url( $ci->config->item( 'base_url' ) . "/daemon" );
        if ( strcmp( $parts['scheme'], 'https' ) == 0 )
        {
            $port = 443;
            $host = "ssl://" . $parts['host'];
        }
        else 
        {
            $port = 80;
            $host = $parts['host'];
        }
        if ( ( $fp = fsockopen( $host, isset( $parts['port'] ) ? $parts['port'] : $port, $errno, $errstr, 30 ) ) === FALSE )
        {
            throw new Exception( "Internal server error: background process could not be started" );
        }
        $ci->load->library( 'encrypt' );
        $post_string = "data=" . urlencode( $ci->encrypt->encode( serialize( func_get_args( ) ) ) );
        $out = "POST " . $parts['path'] . " HTTP/1.1\r\n";
        $out .= "Host: " . $host . "\r\n";
        $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $out .= "Content-Length: " . strlen( $post_string ) . "\r\n";
        $out .= "Connection: Close\r\n\r\n";
        $out .= $post_string;
        fwrite( $fp, $out );
        fclose( $fp );
    }
}

可以调用此方法来处理“背景”中的任何model :: method()。它使用可变参数。

$this->load->library('daemon');
$this->daemon->execute_background( 'model', 'method', $arg1, $arg2, ... );

0

建议:格式化FRAMESET HTML页面,其中包含9帧。每个框架都会获取myapp.php页面的不同“实例”。Web服务器上将并行运行9个不同的线程。


0

对于PHP5.5 +,mpyw / co是最终的解决方案。它就像JavaScript中的tj / co一样工作。

假设您要下载指定的多个GitHub用户的头像。每个用户都需要执行以下步骤。

  1. 获取http://github.com/mpyw的内容(获取HTML)
  2. 查找<img class="avatar" src="...">并请求(获取图像)

---:等待我的响应
...:等待并行流中的其他响应

许多著名的curl_multi基于脚本的脚本已经为我们提供了以下流程。

        /-----------GET HTML\  /--GET IMAGE.........\
       /                     \/                      \ 
[Start] GET HTML..............----------------GET IMAGE [Finish]
       \                     /\                      /
        \-----GET HTML....../  \-----GET IMAGE....../

但是,这不够有效。您想减少毫无价值的等待时间...吗?

        /-----------GET HTML--GET IMAGE\
       /                                \            
[Start] GET HTML----------------GET IMAGE [Finish]
       \                                /
        \-----GET HTML-----GET IMAGE.../

是的,使用mpyw / co非常容易。有关更多详细信息,请访问存储库页面。


-1

当我执行POST到任何页面的特定URL时,这是我自己的PHP函数。

示例:*我的功能的使用...

<?php
    parse_str("email=myemail@ehehehahaha.com&subject=this is just a test");
    $_POST['email']=$email;
    $_POST['subject']=$subject;
    echo HTTP_Post("http://example.com/mail.php",$_POST);***

    exit;
?>
<?php
    /*********HTTP POST using FSOCKOPEN **************/
    // by ArbZ

    function HTTP_Post($URL,$data, $referrer="") {

    // parsing the given URL
    $URL_Info=parse_url($URL);

    // Building referrer
    if($referrer=="") // if not given use this script as referrer
      $referrer=$_SERVER["SCRIPT_URI"];

    // making string from $data
    foreach($data as $key=>$value)
      $values[]="$key=".urlencode($value);
    $data_string=implode("&",$values);

    // Find out which port is needed - if not given use standard (=80)
    if(!isset($URL_Info["port"]))
      $URL_Info["port"]=80;

    // building POST-request: HTTP_HEADERs
    $request.="POST ".$URL_Info["path"]." HTTP/1.1\n";
    $request.="Host: ".$URL_Info["host"]."\n";
    $request.="Referer: $referer\n";
    $request.="Content-type: application/x-www-form-urlencoded\n";
    $request.="Content-length: ".strlen($data_string)."\n";
    $request.="Connection: close\n";
    $request.="\n";
    $request.=$data_string."\n";

    $fp = fsockopen($URL_Info["host"],$URL_Info["port"]);
    fputs($fp, $request);
    while(!feof($fp)) {
        $result .= fgets($fp, 128);
    }
    fclose($fp); //$eco = nl2br();

    function getTextBetweenTags($string, $tagname) {
        $pattern = "/<$tagname ?.*>(.*)<\/$tagname>/";
        preg_match($pattern, $string, $matches);
        return $matches[1]; }
    //STORE THE FETCHED CONTENTS to a VARIABLE, because its way better and fast...
    $str = $result;
    $txt = getTextBetweenTags($str, "span"); $eco = $txt;  $result = explode("&",$result);
    return $result[1];
<span style=background-color:LightYellow;color:blue>".trim($_GET['em'])."</span>
</pre> "; 
}
</pre>

-2

试试这个代码。

$chu = curl_init();

curl_setopt($chu, CURLOPT_URL, 'http://www.myapp.com/test.php?someprm=xyz');

curl_setopt($chu, CURLOPT_FRESH_CONNECT, true);
curl_setopt($chu, CURLOPT_TIMEOUT, 1);

curl_exec($chu);
curl_close($chu);

请不要忘记启用CURL php扩展。


您可以设置CURLOPT_TIMEOUT_MS例如100毫秒,而不是CURLOPT_TIMEOUT几秒钟,并且最小值为1秒-以便更快地执行。
杰森·银

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.