命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法
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模拟定时任务实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。