PHP命令行执行整合pathinfo模拟定时任务实例
来源: 阅读:1280 次 日期:2016-08-29 14:57:02
温馨提示: 小编为您整理了“PHP命令行执行整合pathinfo模拟定时任务实例”,方便广大网友查阅!

命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法

Application.php

class Application{

public static function main(){

header("content-type:text/html;charset=utf-8");

self::register();

self::commandLine();

self::pathInfo();

}

//自动加载

public static function loadClass($class){

$class=str_replace('\\', '/', $class);

$dir=str_replace('\\', '/', __DIR__);

$class=$dir."/".$class.".php";

require_once $class;

}

//命令行下

public static function commandLine(){

if(php_sapi_name()=="cli"){

$_SERVER['PATH_INFO']="";

foreach ($_SERVER['argv'] as $k=>$v) {

if($k==0) continue;

$_SERVER['PATH_INFO'].="/".$v;

}

}

}

//pathinfo处理

public static function pathInfo(){

if(isset($_SERVER['PATH_INFO'])){

$pathinfo=array_filter(explode("/", $_SERVER['PATH_INFO']));

for($i=1;$i<=count($pathinfo);$i++){

$key=isset($pathinfo[$i]) ? $pathinfo[$i] : '';

$value=isset($pathinfo[$i+1]) ? $pathinfo[$i+1] :"";

switch ($i) {

case 1:

$_GET['m']=ucfirst($key);

break;

case 2:

$_GET['c']=ucfirst($key);

break;

case 3:

$_GET['a']=$key;

break;

default:

if($i>3){

if($i%2==0){

$_GET[$key]=$value;

}

}

break;

}

}

}

$_GET['m']=!empty($_GET['m']) ? ucfirst($_GET['m']) : 'Index';

$_GET['c']=!empty($_GET['c']) ? ucfirst($_GET['c']) : 'Index';

$_GET['a']=!empty($_GET['a']) ? $_GET['a'] : 'index';

$class="\\Controller\\{$_GET['m']}\\{$_GET['c']}";

$controller=new $class;

$controller->$_GET['a']();

}

//致命错误回调

public static function shutdownCallback(){

$e=error_get_last();

if(!$e) return;

self::errorHandler($e['type'],'Fatal Error '.$e['message'],$e['file'],$e['line']);

}

//错误处理

protected static function myErrorHandler($errno,$errstr,$errfile,$errline){

list($micseconds,$seconds)=explode(" ",microtime());

$micseconds=round($micseconds*1000);

$micseconds=strlen($micseconds)==1 ? '0'.$micseconds : $micseconds;

if(php_sapi_name()=="cli"){

$break="\r\n";

}else{

$break="
";

}

$mes="[".date("Y-m-d H:i:s",$seconds).":{$micseconds}] ".$errfile." ".$errline." line ".$errstr.$break;

echo $mes;

}

//注册

public static function register(){

error_reporting(0);

set_error_handler(function($errno,$errstr,$errfile,$errline){

self::myErrorHandler($errno,$errstr,$errfile,$errline);

});

register_shutdown_function(function(){

self::shutdownCallback();

});

spl_autoload_register("self::loadClass");

}

}

Application::main();

\Controller\Client\Cron.php

namespace Controller\Client;

class Cron{

private $second=0;

private $tasks=array(

array("duration"=>5,"method"=>"doSomething"),

array("duration"=>2,"method"=>"doSomething2"),

);

public function index(){

while (true) {

sleep(1);

$this->second++;

foreach($this->tasks as $task){

if($this->second%$task['duration']==0){

$this->$task['method']();

}

}

}

}

public function doSomething(){

echo "[".date("Y-m-d H:i:s",time())."] doSomething1 ok!\r\n";

}

public function doSomething2(){

echo "[".date("Y-m-d H:i:s",time())."] doSomething2 ok!\r\n";

}

}

效果:

方法doSomething每隔2秒执行一次

方法doSomething2每隔5秒执行一次

现在执行其他方法是同步的,可以再优化成开新线程执行这些方法,就不会阻塞主线程的定时了

名单

以上这篇PHP命令行执行整合pathinfo模拟定时任务实例就是小编分享给大家的全部内容了,希望能给大家一个参考

更多信息请查看 网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2026上岸·考公考编培训报班

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们| 联系我们| 人才招聘| 网站声明| 网站帮助| 非正式的简要咨询| 简要咨询须知| 新媒体/短视频平台| 手机站点| 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65099533/13759567129 获取招聘考试信息及咨询关注公众号:
咨询QQ:1093837350(9:00—18:00) 版权所有:
云南网警报警专用图标
Baidu
map