ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# PHP CLI模式开发 <https://zhuanlan.zhihu.com/p/98155288> **php\_cli模式简介** php-cli是php Command Line Interface的简称,如同它名字的意思,就是php在命令行运行的接口,区别于在Web服务器上运行的php环境(php-cgi, isapi等) 也就是说,php不单可以写前台网页,它还可以用来写后台的程序。 PHP的CLI shell脚本适用于所有的PHP优势,使创建要么支持脚本或系统甚至与GUI应用程序的服务端!——注:windows和linux下都支持php\_cli模式 判断是否是CLI模式 ``` <pre class="calibre10">``` <span class="token4">define</span><span class="token3">(</span><span class="token2">'IS_CLI'</span><span class="token3">,</span> PHP_SAPI <span class="token1">==</span> <span class="token2">'cli'</span> <span class="token1">?</span> <span class="token6">true</span> <span class="token3">:</span> <span class="token6">false</span><span class="token3">)</span><span class="token3">;</span> ``` ``` **PHP-cli应用场景:** > cli模式的业务场景: > 定时任务,有数据同步,数据处理,多线程,进程通信,共享内存都要使用 cli > 或者你想单独执行某个PHP的时候 1.多线程应用 这方面的好处,引用鸟哥的话: 优点: 1\. 使用多进程, 子进程结束以后, 内核会负责回收资源 2\. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程. 3\. 一个常驻主进程, 只负责任务分发, 逻辑更清楚. php的多线程—没错就是php多线程应用,虽然大家都普遍认为php没有多线程(curl属于模拟多线程而不是真实的),但是在php\_cli模式下的php彻底的是属于多线程。这个时候php属于linux的一个守护进程。 在本人之前写过的《PHP多线程批量采集下载美女图片(续)》的时候在采集程序里虽然使用curl来模拟多线程,但是在浏览器执行的时候也是会遇到执行超时或内存abort而导致程序中断,(要尝试几次才可以彻底成功),但是如果在php-cli模式下执行,你就会发现这个程序执行的很快,php多线程执行的优势被彻底表现出来了. 备注:这种多线程方式不是很成熟,不适合大规模的生成应用,偶尔使用还是可以的 2.定时执行php程序 之前本人总结关于《PHP定时执行计划任务》的三种方式,利用有一张就是利用linux的cron方式,那么这个方式是如何定时执行php程序?请看下文 3.开发桌面程序 你可以做您的Windows或Linux中使用PHP的图形用户界面(GUI)应用!所有你需要的是PHP的命令行接口和一包GTK。这将允许建立真正的便携式图形用户界面应用程序(呵呵,之前只是知道php可以做桌面程序,现在才知道是使用php\_cli模式),并且不需要学习别的。 4.编写PHP的shell脚本 如果你不会bash shell或者Perl等的使用,但是你又需要一些脚本去执行的时候,怎么办?这个时候你完全可以使用你熟悉的php编写shell脚本,这个时候你是不是突然感觉PHP是不是太强大了!—–真正做到一种语言,到处开发! **PHP\_CLI使用方法** win下面的执行方法: 假设php.exe 在D:xamppphp在dos命令在可以这个执行: ``` <pre class="calibre10">``` D<span class="token3">:</span>\xamppphpphp<span class="token3">.</span>exe D<span class="token3">:</span>\xampphtdocstest<span class="token3">.</span>php ``` ``` 就可以执行test.php这个文件了 。这里推荐win平台下xampp集成环境,真正比wamp强大N倍,这个集成包可以直接进入dos模式。 linux下php\_cli使用 首先找到你安装php的路径,以我为例: ![](https://img.kancloud.cn/c8/b5/c8b5eab8fa46d2e0b204c4a55eff79ce_444x72.png) php安装在路径/usr/local/php/bin/php下键入以下内容 ``` <pre class="calibre10">``` <span class="token1">/</span>usr<span class="token1">/</span>local<span class="token1">/</span>php<span class="token1">/</span>bin<span class="token1">/</span>php <span class="token1">/</span>usr<span class="token1">/</span>local<span class="token1">/</span>apache<span class="token1">/</span>htdocs<span class="token1">/</span>a<span class="token3">.</span>php ``` ``` 就可以执行a.php文件 **PHP\_CLI编程需知** 如何检测环境支持php\_cli模式? ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">?</span>php <span class="token">//方法1 </span> <span class="token5">if</span> <span class="token3">(</span>PHP_SAPI <span class="token1">===</span> <span class="token2">'cli'</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">// ... </span> <span class="token3">}</span> <span class="token">//方法2 </span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">php_sapi_name</span><span class="token3">(</span><span class="token3">)</span> <span class="token1">===</span> <span class="token2">'cli'</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">// ... </span> <span class="token3">}</span> ``` ``` **PHP\_ClI如何接收参数?** 默认情况下/usr/local/php/bin/php接收参数是$argv,这个变量是固定的!在php文件中 ``` <pre class="calibre10">``` <span class="token4">var_dump</span><span class="token3">(</span>$argv<span class="token3">)</span><span class="token3">;</span> ``` ``` 得到下面结果: ![](https://img.kancloud.cn/67/9b/679bfb2e09583ecd8abe256028b3c140_636x111.png) 可以写个简单的处理函数把这个方式转化为大家常用的GET/post的参数模式 ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">?</span>php <span class="token5">function</span> <span class="token4">parseArgs</span><span class="token3">(</span>$argv<span class="token3">)</span><span class="token3">{</span> <span class="token4">array_shift</span><span class="token3">(</span>$argv<span class="token3">)</span><span class="token3">;</span> $out <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> foreach <span class="token3">(</span>$argv as $arg<span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token6">0</span><span class="token3">,</span><span class="token6">2</span><span class="token3">)</span> <span class="token1">==</span> <span class="token2">'--'</span><span class="token3">)</span><span class="token3">{</span> $eqPos <span class="token1">=</span> <span class="token4">strpos</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token2">'='</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span>$eqPos <span class="token1">===</span> <span class="token6">false</span><span class="token3">)</span><span class="token3">{</span> $key <span class="token1">=</span> <span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token6">2</span><span class="token3">)</span><span class="token3">;</span> $out<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> <span class="token4">isset</span><span class="token3">(</span>$out<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span> <span class="token1">?</span> $out<span class="token3">[</span>$key<span class="token3">]</span> <span class="token3">:</span> <span class="token6">true</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> $key <span class="token1">=</span> <span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token6">2</span><span class="token3">,</span>$eqPos<span class="token1">-</span><span class="token6">2</span><span class="token3">)</span><span class="token3">;</span> $out<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> <span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span>$eqPos<span class="token1">+</span><span class="token6">1</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token6">0</span><span class="token3">,</span><span class="token6">1</span><span class="token3">)</span> <span class="token1">==</span> <span class="token2">'-'</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token6">2</span><span class="token3">,</span><span class="token6">1</span><span class="token3">)</span> <span class="token1">==</span> <span class="token2">'='</span><span class="token3">)</span><span class="token3">{</span> $key <span class="token1">=</span> <span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token6">1</span><span class="token3">,</span><span class="token6">1</span><span class="token3">)</span><span class="token3">;</span> $out<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> <span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token6">3</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> $chars <span class="token1">=</span> <span class="token4">str_split</span><span class="token3">(</span><span class="token4">substr</span><span class="token3">(</span>$arg<span class="token3">,</span><span class="token6">1</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> foreach <span class="token3">(</span>$chars as $char<span class="token3">)</span><span class="token3">{</span> $key <span class="token1">=</span> $char<span class="token3">;</span> $out<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> <span class="token4">isset</span><span class="token3">(</span>$out<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span> <span class="token1">?</span> $out<span class="token3">[</span>$key<span class="token3">]</span> <span class="token3">:</span> <span class="token6">true</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> $out<span class="token3">[</span><span class="token3">]</span> <span class="token1">=</span> $arg<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">return</span> $out<span class="token3">;</span> <span class="token3">}</span> <span class="token4">var_dump</span><span class="token3">(</span>$argv<span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span><span class="token4">parseArgs</span><span class="token3">(</span>$argv<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span>exit<span class="token3">;</span> ``` ``` ![](https://img.kancloud.cn/0f/0c/0f0cb638b1f8971f795826b6ed4a9f41_536x93.png) **关于定时执行** cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业,周期性作业,比如备份数据 打开/etc/crontab,添加: ``` <pre class="calibre17">``` <span class="token1">/</span>usr<span class="token1">/</span>bin<span class="token1">/</span>php <span class="token1">-</span>f <span class="token1">/</span>data<span class="token1">/</span>htdocs<span class="token1">/</span>test<span class="token3">.</span>php ``` ```