gpt4 book ai didi

PHP命令行执行整合pathinfo模拟定时任务实例

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章PHP命令行执行整合pathinfo模拟定时任务实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

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模拟定时任务实例

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

最后此篇关于PHP命令行执行整合pathinfo模拟定时任务实例的文章就讲到这里了,如果你想了解更多关于PHP命令行执行整合pathinfo模拟定时任务实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com