> 백엔드 개발 > PHP 튜토리얼 > PHP fsockopen函数问题,本脚本无阻塞触发其他脚本失败

PHP fsockopen函数问题,本脚本无阻塞触发其他脚本失败

WBOY
풀어 주다: 2016-06-06 20:15:33
원래의
884명이 탐색했습니다.

<code>    $host = 'www.abc.com';
    $port = 80;
    $query = "admin/mi.php?key=value";
    
    $fp = @fsockopen($host, $port, $errno, $errstr, 30);
    if ($fp) {
        $out = "GET /".$query." HTTP/1.1\r\n";
        $out .= "Host: ".$host."\r\n";
        $out .= "Connection: Close\r\n\r\n";
        // 0,资源流将会被转换为非阻塞模式;1,资源流将会被转换为阻塞模式。
        @stream_set_blocking($fp, 0);
        @stream_set_timeout($fp, 5);
        fwrite($fp, $out);
        // sleep(1); //关键地方
        fclose($fp);
    } else {
        echo "$errstr ($errno)<br>\n";
    }

    -------------
    看关键地方 有SLEEP(1)  请求 www.abc.com 成功,没有 SLEEP(1)请求不成功,FSOCKOPEN运作机制是什么呢?  
    我想在这个脚本里无阻塞访问www.abc.com/admin/mi.php 不需要返回数据。只是需要触发MI.PHP执行。</code>
로그인 후 복사
로그인 후 복사

回复内容:

<code>    $host = 'www.abc.com';
    $port = 80;
    $query = "admin/mi.php?key=value";
    
    $fp = @fsockopen($host, $port, $errno, $errstr, 30);
    if ($fp) {
        $out = "GET /".$query." HTTP/1.1\r\n";
        $out .= "Host: ".$host."\r\n";
        $out .= "Connection: Close\r\n\r\n";
        // 0,资源流将会被转换为非阻塞模式;1,资源流将会被转换为阻塞模式。
        @stream_set_blocking($fp, 0);
        @stream_set_timeout($fp, 5);
        fwrite($fp, $out);
        // sleep(1); //关键地方
        fclose($fp);
    } else {
        echo "$errstr ($errno)<br>\n";
    }

    -------------
    看关键地方 有SLEEP(1)  请求 www.abc.com 成功,没有 SLEEP(1)请求不成功,FSOCKOPEN运作机制是什么呢?  
    我想在这个脚本里无阻塞访问www.abc.com/admin/mi.php 不需要返回数据。只是需要触发MI.PHP执行。</code>
로그인 후 복사
로그인 후 복사

关键地方加上 usleep(1000); 【延时1000微秒 = 1毫秒 = 0.001秒】 就可以了。目前稳定。

--- 云网开

$fp被你close了。无阻塞不代表能保证数据发完,发送数据过程其实是挺漫长的,要域名解析,要建立链接,还没等事情做完,你就close了,不成功的概率很高。

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿