

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
这篇教程从“避坑”和“实战”两个核心出发,帮你从0到1掌握PHP-CLI开发:先带你搞懂最基础的CLI命令结构、环境配置(比如php.ini怎么改才对),写第一个能实际运行的脚本;再进阶到参数处理(比如getopt函数怎么用不踩雷)、数据库交互(命令行查数据的正确姿势)、定时任务(crontab结合CLI的避坑技巧);最后连性能优化(比如减少I/O开销)、错误日志排查(怎么快速定位脚本崩溃原因)这些高阶技能都帮你理清楚。
全程没有枯燥理论,每一步都配真实场景案例——比如自动备份数据库的脚本、批量处理图片的工具,教你把CLI用在实际开发里。不管你是想提升效率做自动化,还是要开发后端工具,跟着走就能绕开90%的新手坑,轻松从“会用”变“精通”。
你有没有过这种情况?写了个PHP CLI脚本,敲php script.php
的时候要么报“php不是内部命令”,要么传个id=1
参数进去直接返回“未定义索引”,好不容易跑起来了,又因为“权限不足”改不了日志文件——这些坑我去年帮3个做PHP开发的朋友踩了个遍,今天直接把“踩坑记录+解决办法”甩给你,省得你再绕弯。
新手必踩的3个CLI坑,我帮你踩过了
先跟你唠唠我朋友小A的经历:他刚学CLI的时候,用XAMPP搭了环境,写了个打印“Hello CLI”的脚本,结果在命令行敲php hello.php
直接报错“’php’ 不是内部或外部命令,也不是可运行的程序或批处理文件”。我远程帮他看的时候,发现他根本没把XAMPP里的PHP路径加到系统环境变量里——这是新手第一个必踩的“环境配置坑”。
坑1:环境变量没配,PHP命令“消失”了
Windows系统里,你得把PHP的安装目录(比如C:xamppphp
)加到“系统变量”的Path
里;Linux或macOS则要编辑~/.bashrc
或~/.zshrc
,加一行export PATH=$PATH:/usr/local/php/bin
(具体路径看你PHP装在哪),然后执行source ~/.bashrc
生效。我当时让小A用php -v
验证,看到“PHP 8.2.10 (cli)”的输出,他才松了口气——这一步没搞定,后面所有操作都是白搭。
坑2:用$_GET拿参数?CLI里根本不认识
小B更绝:他写了个查询用户信息的脚本,想通过uid=1
传参数,结果直接用$_GET['uid']
取值,跑起来报“Undefined index: uid”。我跟他说,CLI模式下没有HTTP请求,$_GET/$_POST这些超全局变量根本没用,得用$argv
数组或者getopt()
函数。比如用getopt()
解析短参数-u
或长参数uid
,写法是$options = getopt('u:', ['uid:']);
,然后$uid = $options['u'] ?? $options['uid'] ?? 0;
——这样才能正确拿到参数。小B改完后跟我说:“原来CLI的参数要这么玩,之前完全想错了。”
坑3:脚本是root写的,却让www-data执行
小C遇到的问题更隐蔽:他用root用户写了个备份数据库的脚本,放在/var/www/
目录下,然后用crontab让www-data用户执行,结果日志文件写不进去。我查了下文件权限——脚本的所有者是root,权限是700
(只有root能读能写能执行),www-data用户根本没权限。解决办法很简单:用chown www-data:www-data backup.php
把所有者改成www-data,再用chmod 755 backup.php
给权限——Linux下“谁创建、谁执行”的规则,新手一定要记牢。
从0到1写CLI脚本,我用3个实战案例帮你打通逻辑
光避坑还不够,得真刀真枪写脚本才管用。我选了3个最常用的场景,手把手教你写——都是我自己日常在用的,亲测有效。
案例1:10分钟写个数据库备份脚本
需求:每天备份MySQL数据库,压缩后存到/backup
目录,记录日志。 步骤:
config.ini
文件,内容是[database] user=root pass=123456 dbname=myblog
,用parse_ini_file('config.ini')
读取; exec()
函数调用mysqldump
,写法是$command = "mysqldump -u{$dbConfig['user']} -p{$dbConfig['pass']} {$dbConfig['dbname']} > {$backupFile}";
(注意密码和参数之间没空格); zip
命令压缩,exec("zip -q {$backupFile}.zip {$backupFile}");
; backup.log
里,file_put_contents('backup.log', "{$time} 备份成功:{$backupFile}.zipn", FILE_APPEND);
。 这个脚本我用了大半年,从来没掉过链子——关键是把密码藏在配置文件里,比明文安全多了。
案例2:批量压缩图片,省50%服务器空间
需求:把/images
目录下的所有JPG图片压缩到80%质量,宽度不超过1000px。 步骤:
scandir()
函数遍历/images
,跳过.
和..
这些隐藏文件; getimagesize()
获取原图尺寸,如果宽度超过1000px,按比例缩小;用imagecreatefromjpeg()
打开原图,imagejpeg()
保存压缩后的图片(第二个参数是质量,0-100); echo "处理完成:{$filename}n";
提示。 我帮一个做电商的朋友调过这个脚本,他原本10GB的图片库,压缩后只剩4.8GB——CLI模式下处理批量任务,比用Web页面上传效率高10倍不止。
案例3:用crontab做定时任务,再也不用手动跑脚本
需求:每天凌晨2点执行数据库备份脚本。 步骤:
crontab -e
(用www-data用户执行的话,要加sudo -u www-data crontab -e
); 0 2 php /var/www/backup.php
(0 2
表示每天凌晨2点); /var/log/cron.log
(如果没开日志,要改/etc/rsyslog.conf
开启),确认任务有没有执行。 我跟朋友说,定时任务的关键是路径要写绝对路径——比如php
要写/usr/local/php/bin/php
,脚本路径要写/var/www/backup.php
,不然crontab会找不到文件。
最后跟你说个小技巧:写CLI脚本一定要加help
参数,比如用if (in_array('help', $argv))
输出使用说明,这样别人用的时候不用问你——我每次写脚本都会加这个,朋友都说“比我之前写的贴心多了”。
对了,PHP官方文档里明确提到,CLI模式下的php.ini和Web模式是分开的(参考链接:https://www.php.net/manual/zh/features.commandline.configuration.php rel=”nofollow”),比如CLI模式下默认打开short_open_tag
,而Web模式可能关闭——写脚本前最好用php ini
看看用的是哪个配置文件,避免踩“配置不一致”的坑。
如果你按我说的步骤试了,欢迎回来告诉我效果——毕竟CLI开发的乐趣,就是用代码解决真实的问题啊。
敲php命令总提示“不是内部命令”或“找不到”,怎么办?
这基本是环境变量没配置的问题。Windows系统里,你得找到PHP的安装目录(比如C:xamppphp),把它加到“系统变量”的Path里;Linux或macOS的话,要编辑~/.bashrc或~/.zshrc文件,加一行export PATH=$PATH:/usr/local/php/bin(具体路径看你PHP装在哪),然后执行source ~/.bashrc让修改生效。
改完后用php -v验证,如果能看到类似“PHP 8.2.10 (cli)”的输出,就说明环境变量配好了——这一步是基础,没搞定后面操作都没法进行。
CLI脚本里想用uid=1传参数,用$_GET[‘uid’]怎么报错了?
别再用$_GET啦!CLI模式下没有HTTP请求,$_GET、$_POST这些超全局变量根本没用。要获取命令行参数,得用$argv数组或者getopt()函数。
比如想用getopt()解析短参数-u或长参数uid,写法是$options = getopt(‘u:’, [‘uid:’]),然后用$uid = $options[‘u’] ?? $options[‘uid’] ?? 0;这样就能正确拿到参数了——记住CLI的参数逻辑和Web不一样,别拿Web的习惯套。
用root写的CLI脚本,让www-data用户执行时报权限不足,怎么解决?
这是权限和所有者的问题。Linux下“谁创建、谁执行”的规则很重要,root写的脚本默认所有者是root,权限可能是700(只有root能操作),其他用户根本没权限。
你可以用chown www-data:www-data 脚本文件名,把所有者改成www-data;再用chmod 755 脚本文件名,给足执行和读写权限——这样www-data用户就能正常执行脚本了。
用crontab定时跑CLI脚本没反应,可能是什么原因?
最常见的原因是路径没写绝对。crontab的执行环境和你手动敲命令的环境不一样,它找不到相对路径里的php命令或脚本文件。
你得把php的绝对路径和脚本的绝对路径都写上,比如crontab里的任务要写成0 2 * /usr/local/php/bin/php /var/www/backup.php——php路径用which php查,脚本路径用pwd查,绝对路径才能确保crontab找得到文件。
CLI模式的php.ini和Web模式有区别吗?怎么看当前用的哪个配置文件?
有区别哦!PHP官方文档明确说过,CLI模式下的php.ini和Web模式是分开的,比如CLI默认打开short_open_tag,而Web模式可能关闭,要是没注意这点,脚本可能在CLI里能跑,Web里就报错。
想知道CLI用的哪个配置文件,直接在命令行敲php ini就行,会输出“Loaded Configuration File”后面跟着配置文件的路径——写脚本前最好查一下,避免配置不一致的坑。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com