2020 年了,现在最简单的 PHP 执行异步任务的方式是什么,不要框架,尽量十几二十行 PHP 代码能搞定?

2020-06-12 15:50:05 +08:00
 frozenway

想在这台服务器(国内)php 保存某些数据后,去更新另外一台服务器(国外)的文件缓存,如果是同步更新,保存数据的响应结果会太慢太卡,想着异步去做。要求尽量简单,不想左一个框架右一个框架,不用 redis,memkache 等,因为开启这些扩展需要编译 php,麻烦

7329 次点击
所在节点    PHP
44 条回复
sagaxu
2020-06-13 16:18:55 +08:00
“报告长官,有人在诋毁和攻击 PHP”
“他都胡说八道些什么?”
“他竟然把 PHP 特性和技巧讲了一遍”
msg7086
2020-06-13 19:35:34 +08:00
建议招个运维,解决一下开 PHP 扩展要编译 PHP 的问题。
cbasil
2020-06-15 09:48:26 +08:00
最简单的使用 fsockopen
$fp = fsockopen ( $hostname, $port, $errno, $errstr, 600 );
stream_set_blocking ( $fp, 0 ); //开启非阻塞模式
fputs ( $fp, "GET " . $url . "\r\n" );
fclose ( $fp );
jeepc
2020-06-23 15:31:53 +08:00
<?php

namespace app\util;


class HttpUtils
{


/**
* 异步执行
* @param $host
* @param $path
* @param array $param
* @return false|int|string
*/
public static function requestAsync($host, $path, $param = array())
{

$query = isset($param) ? http_build_query($param) : '';

$fp = @fsockopen($host);

if (!$fp) {
logError('连接失败');
return 'connection error';
}

stream_set_blocking($fp, 0); //非阻塞
stream_set_timeout($fp, 1);//响应超时时间( S )
$out = "POST " . $path . " HTTP/1.1\r\n";
$out .= "host:" . $host . "\r\n";
$out .= "content-length:" . strlen($query) . "\r\n";
$out .= "content-type:application/x-www-form-urlencoded\r\n";
$out .= "connection:close\r\n\r\n";
$out .= $query;

$result = @fputs($fp, $out);

@fclose($fp);
return $result;

}

}

<?php

namespace app\api\controller;

use app\util\HttpUtils;
use think\Controller;
use think\facade\Log;

class Test extends Controller
{
public function test(){
sleep(5);
Log::record(1111);
}

public function testAsync(){

HttpUtils::requestAsync($_SERVER['HTTP_HOST'],'/api/test/test');
dump('return');
}

}

仅供参考

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681005

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX