命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法
Application.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
<?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' ], '<font color="red">Fatal Error</font> ' . $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 = "<br/>" ; } $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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?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模拟定时任务实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。