學習路之PHP --異步執行功能 (無需安裝任何框架)
- 簡介
- 一、工具類
- 二、調用
- 三、異步任務的操作
- 四、效果:
簡介
執行異步任務是一種很常見的需求,如批量發郵箱,短信等等執行耗時任務時,需要程序異步執行,給用戶帶來好的體驗。
在php異步執行代碼就很尬尷,不像java 可以創建多線程,在php中也可以用pcntl_fork()實現創建子進程,來實現異步,但這樣可能會產生很多僵尸進程。其他的方式借助框架實現,如優秀的swoole框架,本文介紹無需安裝如何框架擴展,php自帶的方式處理下面直接上代碼,我用的thinkphp6
一、工具類
extend\util\AsyncHook.php,代碼如下
<?php
namespace util;class AsyncHook
{private static $hook_list = array();private static $hooked = false;/*** hook函數fastcgi_finish_request執行** @param callback $callback* @param array $params*/public static function hook($callback, $params = []){trace('這里是'.__CLASS__.'\\'.__FUNCTION__);self::$hook_list[] = array('callback' => $callback, 'params' => $params);if (self::$hooked == false) {self::$hooked = true;register_shutdown_function(array(__CLASS__, '__run'));}}/*** 由系統自動調用:支持win10:phpstudy** @return void*/public static function __run(){if (function_exists('fastcgi_finish_request')) {fastcgi_finish_request();}if (empty(self::$hook_list)) {return;}foreach (self::$hook_list as $hook) {$callback = $hook['callback'];$params = $hook['params'];call_user_func_array($callback, $params);}}}
二、調用
route\app.php
Route::get('helloasync', function () {$namespaceClass = "app\\api\\Task\\Test";$classObj = app($namespaceClass);\util\AsyncHook::hook([$classObj,"index"],['name'=>1,'age'=>18]);return "執行完成";// $this->success("執行完成");});
三、異步任務的操作
<?php
declare (strict_types = 1);namespace app\api\Task;
// 添加這句
use hg\apidoc\annotation as Apidoc;
use think\facade\Log;/*** @Apidoc\Title("api模塊Task控制器類")*/
class Test
{/*** @Apidoc\Title("index接口")* ...*/ public function index(...$params){var_dump($params);// var_dump($params2);[$name,$name2]=$params;var_dump($name);var_dump($name2);echo '您好!這是一個異步任務的操作'.__CLASS__.'\\'.__FUNCTION__;}
}
四、效果:
執行結果,會先’執行完成’,后執行hook中的Test index方法。