- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
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模拟定时任务实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!