求助 使用php fsockopen 实现多线程 碰到的问题 !

  • 业务:访问一个url,触发一个方法,这个方法中自己拼接了一个http请求,利用php的fsockopen函数、以及fwrite函数,再次发起一个get或者post请求,实现php的多线程(这个应该是多线程吧)

  • 问题:用这样的方式,拼接get请求可以成功访问,但是拼接post请求一直不能成功(我再次触发的方法中是忘一个文件中写入东西,get可以成功写入,post不行).

  • 访问的代码如下

public function ForFsockopen () {
        $host = '127.0.0.1:8000';  
        $port = 80;  
        $errno = '';  
        $errstr = '';  
        $timeout = 30;  
        $url = '/testfsock';  
          
        $param = array(  
            'name' => 'fdipzone',  
            'gender' => 'man'  
        );  

        $data = http_build_query($param);  
          
        // create connect  
        $fp = fsockopen($host, $port, $errno, $errstr, $timeout); 

        if (!$fp) {
            echo "$errstr ($errno)<br />\n";
        } else {
            // $out = "GET $url HTTP/1.1\r\n";  
            // $out .= "Host: $host\r\n";  
            // $out .= "Connection:close\r\n\r\n";

            $out = "POST $url HTTP/1.1\r\n";
            $out .= "Host: $host\r\n";
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out .= "Content-Length: ".strlen($data)."\r\n";
            $out .= "Referer: http://".$host.$url."\r\n";
            $out .= "X-CSRF-TOKEN:csrf_token()\r\n";
            $out .= "Cookie: username=admin;uid=200\r\n";
            $out .= "Connection: Close\r\n\r\n";

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

    } 
  • 再次发起请求触发的代码如下

public function TestFsock () {
    $fp = fopen('file/test.txt', 'a');

    for ($i = 0; $i < 1000; $i ++ ) {
        fwrite($fp, '888888');
    }

    fclose($fp);
}
  • 路由如下

Route::get('/forsockopen', "TestController@ForFsockopen");
Route::post('/testfsock', "TestController@TestFsock");
// Route::get('/testfsock', "TestController@TestFsock");
Power

@jellyBool

JellyBool 回复 Power

具体是什么不成功?

Route::post('/testfsock', "TestController@TestFsock");
// Route::get('/testfsock', "TestController@TestFsock");

这两个不成功?

Power 回复 JellyBool

当我执行

Route::get('/forsockopen', "TestController@ForFsockopen");

这个路由的时候,进入方法中,执行我拼接的http请求,这个时候拼接的是一个post请求,但是请求一直发送不成功,但是当我拼接的http换成get请求时候(注释掉的那段) 这个请求就可以执行成功,执行

// Route::get('/testfsock', "TestController@TestFsock");

里面的操作

JellyBool 回复 Power

具体有什么错误么?你试试关掉 csrf:

    $out .= "X-CSRF-TOKEN:csrf_token()\r\n";
            $out .= "Cookie: username=admin;uid=200\r\n";

然后暂时不要这些额外的数据试试先

Power 回复 JellyBool

都试过了,csrf也关掉了,就是不行 我都试过了 百度过了 没办法了 才来问的!
因为他是在方法里面再次触发http请求的,也没有给我什么报错信息,日志也没有!
所以我一脸懵逼,我也不知道要怎么调试这个拼接的http请求是否可行

JellyBool 回复 Power

            $out = "POST $url HTTP/1.1\r\n";
            $out .= "Host: $host\r\n";
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out .= "Content-Length: ".strlen($data)."\r\n";
            $out .= "Referer: http://".$host.$url."\r\n";
            $out .= "X-CSRF-TOKEN:csrf_token()\r\n";
            $out .= "Cookie: username=admin;uid=200\r\n";
            $out .= "Connection: Close\r\n\r\n";

            fwrite($fp, $out);

这些信息,每一行都打印出来看

Power 回复 JellyBool

是把每一行的拼接结果字符串打印出来看? 我没怎么明白!

JellyBool 回复 Power

每一步的执行结果都看呗,不然都不知道哪的错

Power 回复 JellyBool

应该有讲明白吧。