<?php if ($_SERVER['argc'] < 2) { echo "调用不正确!\n"; echo "调用方式:"; echo "php {$_SERVER['argv'][0]} { rsync_show | rsync_show_by_id 1231123 | rsync_douban }\n"; exit(-1); } function rsync_show() { echo "调用节目数据\n"; } function rsync_show_by_id($id) { if(empty($id)){ echo "缺少参数...\n"; exit(-1); } echo "根据指定ID开始导入节目数据\n"; } function rsync_douban() { echo "调用豆瓣数据层\n"; } foreach ($_SERVER['argv'] as $k => $v) { if($k == 0) continue; if($v == 'rsync_show_by_id'){ call_user_func($v, $_SERVER['argv'][2]); break; }else{ call_user_func($v); } } exit(0);
查看几个调用结果
错误1
错误2
正确的调用方式
通过crontab -e设置个定时执行脚本
运行脚本
2、添加一个停止脚本
3、函数整理
第一个问题,直接用start方法就行了,没必要再写一个方法!——多写一个方法是要付出代价的。
第二个问题怎么解决,我忽然想到在我们安装开源软件的时候喜欢这么用,如下图
所以我决定也使用类似的方法作为参数传递之用。
具体看我下面的方法调用啊!
运行脚本
重点:
1、函数调用
start $2 # 这是函数 + 参数
函数中的 $1表示第一个参数!
2、字符截取
${1:2:2} 表示把$1这个变量里的值从第2个(下标是从0开始的)下标开始,截取2个长度的字符。
ID=${1#--id=}表示从$1这个变量开头删除最近匹配--id=的子串。
放入crontab中
我在php的源代码中的configure中发现了一个不错的输出字符的方法,与大家分享
最近发现脚本一天执行完毕不了,这样就产生多个脚本在后台执行的问题,解决方案如下
运行效果
#!/bin/bash WORK_DIR="/home/www/test/" SCRIPT_NAME=index.php function start() { if [ "$1" != "" ] && [ ${1:2:2} == "id" ] then ID=${1#--id=} echo "开始导入ID为$ID的数据" nohup php $WORK_DIR/$SCRIPT_NAME rsync_show_by_id $ID & exit 0 fi pid=`ps aux | grep $SCRIPT_NAME | grep -v grep | awk '{print $2}'` if [ "$pid" != "" ] then echo "脚本已经启动..." exit 0 fi echo "开始导入数据..." nohup php $WORK_DIR/$SCRIPT_NAME rsync_show rsync_douban & } function stop() { echo "结束导入数据..." #pkill -9 -f index.php pid=`ps aux | grep $SCRIPT_NAME | grep -v grep | awk '{print $2}'` if [ "$pid" != "" ] then kill -9 $pid &>/dev/null fi } function restart() { stop start } case "$1" in start ) start $2 ;; stop ) stop ;; restart ) restart ;; * ) cat <<_ACEOF 使用方法: $0 { start | stop | restart } 选项配置 $0 start --id=1003 _ACEOF ;; esac exit 0