phpsapicli
① php鐚沧暟瀛椾唬镰
鐚沧暟娓告垙链変袱绉岖帺娉曪细
绗涓绉嶏细涓や釜浜虹帺锛屼竴鏂瑰嚭鏁板瓧锛屼竴鏂圭寽銆傚嚭鏁板瓧镄勪汉瑕佹兂濂戒竴涓鎸囧畾浣嶆暟镄勬暟锛屾暟瀛楀彲閲嶅嶏纴涓嶈兘璁╃寽镄勪汉鐭ラ亾銆
鐚灭殑浜哄氨鍙浠ュ紑濮嬬寽銆傛疮鐚滀竴涓鏁帮纴鍑烘暟钥呭氨瑕佽村ぇ杩囨垨灏忚繃鍑虹殑鏁般
绗浜岀嶏细涓や釜浜虹帺锛屼竴鏂瑰嚭鏁板瓧锛屼竴鏂圭寽銆傚嚭鏁板瓧镄勪汉瑕佸厛𨱍冲ソ涓涓娌℃湁閲嶅嶆暟瀛楃殑4浣嶆暟锛屼笉鑳借╃寽镄勪汉鐭ラ亾銆傜寽镄
浜哄氨鍙浠ュ紑濮嬬寽銆傛疮鐚滀竴涓鏁帮纴鍑烘暟钥呭氨瑕佹牴鎹杩欎釜鏁板瓧缁椤嚭鍑燗鍑燘锛屽叾涓瑼鍓嶉溃镄勬暟瀛楄〃绀轰綅缃姝g‘镄勬暟镄勪釜鏁帮纴钥
B鍓岖殑鏁板瓧琛ㄧず鏁板瓧姝g‘钥屼綅缃涓嶅圭殑鏁扮殑涓鏁般傚傛g‘绛旀堜负5234锛岃岀寽镄勪汉鐚5346锛屽垯鏄1A2B锛屽叾涓链変竴涓5镄勪綅
缃瀵逛简锛岃颁负1A锛岃3鍜4杩欎袱涓鏁板瓧瀵逛简锛岃屼綅缃娌″癸纴锲犳よ颁负2B锛屽悎璧锋潵灏辨槸1A2B銆傛帴镌鐚灭殑浜哄啀镙规嵁鍑洪樿呯殑
鍑燗鍑燘缁х画鐚滐纴鐩村埌鐚滀腑涓烘銆
涓嬮溃鏄疨HP浠g爜瀹炵幇锛
<?php
//镙囧嗳杈揿叆娴佸拰镙囧嗳杈揿嚭娴
$stdin=null;
$stdout=null;
/**
*鍒濆嫔寲IO娴
*/
functioninit(){
global$stdin;
global$stdout;
$stdin=fopen('php://stdin','r');
$stdout=fopen('php://stdout','w');
}
/**
*鍏抽棴IO娴
*/
functiondestroy(){
global$stdin;
global$stdout;
if(is_resource($stdin)){
fclose($stdin);
}
if(is_resource($stdout)){
fclose($stdout);
}
}
/**
*浠庡懡浠よ岃诲彇涓琛屾暟鎹
*/
functionread(){
global$stdin;
$line=fgets($stdin);
returntrim($line,PHP_EOL);//铡婚櫎鎹㈣岀
}
/**
*钖戝懡浠よ岃緭鍑轰竴琛屾暟鎹
*/
functionwrite($line){
global$stdout;
//杞鎹㈢紪镰
if(stripos(PHP_OS,'winnt')!==false){
$line=iconv('UTF-8','GBK',$line);
}
fwrite($stdout,$line.PHP_EOL);
}
/**
*绗涓绉岖帺娉
*@param$count浣嶆暟
*/
functionguess_the_number($count=2){
//闅忔満鐢熸垚涓涓$count浣嶆暟
$min=pow(10,$count-1);
$max=pow(10,$count)-1;
$number=rand($min,$max);
init();
while(1){
write(sprintf('Pleaseinputyournumber(%s-bitdigit),qorquitexit:',$count));
$readStr=read();
//exitprogram
if($readStr=='q'||$readStr=='quit'){
break;
}
$readInt=intval($readStr);
if($readInt>$number){
write('澶т简');
}elseif($readInt<$number){
write('灏忎简');
}else{
write('鎭锽滀綘锛岀寽瀵逛简!');
write('Inputccontinuetoplay');
$readStr=read();
if($readStr=='c'||$readStr=='continue'){
$number=rand($min,$max);
}else{
break;
}
}
}
destroy();
}
/**
*寰楀埌涓涓娌℃湁閲嶅嶆暟瀛楃殑锲涗綅鏁
*/
functiongetRandNumber(){
$num=rand(1,9);
$array=array_diff(array(0,1,2,3,4,5,6,7,8,9),[$num]);
shuffle($array);
$subarr=array_slice($array,0,3);//鍐嶅彇3涓鏁板瓧
$str=implode('',array_merge([$num],$subarr));
returnintval($str);
}
/**
*绗浜岀岖帺娉
*/
functionguess_the_number2(){
$number=getRandNumber();
$len=4;//锲涗綅鏁
init();
while(1){
write(sprintf('Pleaseinputyournumber(%s-bitdigit),qorquitexit:',$len));
$readStr=read();
//exitprogram
if($readStr=='q'||$readStr=='quit'){
break;
}
$readInt=intval($readStr);
if($readInt==$number){
write('鎭锽滀綘锛岀寽瀵逛简!');
write('Inputccontinuetoplay');
$readStr=read();
if($readStr=='c'||$readStr=='continue'){
$number=getRandNumber();
}else{
break;
}
}else{
//鍒ゆ柇鍑燗鍑燘
$readInt=str_pad($readInt,$len,'0',STR_PAD_LEFT);//涓嶈冻锲涗綅镄勮ˉ瓒冲洓浣
$number=strval($number);
$readArr=str_split($readInt,1);//casttoarray
$numArr=str_split($number,1);
$aval=0;//鍑燗
$bval=0;//鍑燘
for($i=0;$i<$len;$i++){
if($readArr[$i]==$numArr[$i]){
$aval++;
unset($readArr[$i],$numArr[$i]);
}
}
$bval=count(array_intersect($readArr,$numArr));
write(sprintf('%sA%sB',$aval,$bval));
}
}
destroy();
}
if(PHP_SAPI=='cli'){
//guess_the_number(1);
guess_the_number2();
}else{
echo'Pleaserunundercommandline!';
exit;
}
② Php cli是守护进程的吗
php_cli模式简介
php-cli是php Command Line Interface的简称,如同它名字的意思,就是php在命令行运行的接口,区别于在Web服务器上运行的php环境(php-cgi, isapi等) 也就是说,php不单可以写前台网页,它还可以用来写后台的程序。 PHP的CLI shell脚本适用于所有的PHP优势,使创建要么支持脚本或系统甚至与GUI应用程序的服务端!——注:windows和linux下都支持php_cli模式
PHP-cli应用场景:
1.多线程应用
这方面的好处,引用鸟哥的话:
优点:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源
2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
php的多线程—没错就是php多线程应用,虽然大家都普遍认为php没有多线程(curl属于模拟多线程而不是真实的),但是在php_cli模式下的php彻底的是属于多线程。这个时候php属于linux的一个守护进程。 在本人之前写过的《PHP多线程批量采集下载美女图片(续)》的时候在采集程序里虽然使用curl来模拟多线程,但是在浏览器执行的时候也是会遇到执行超时或内存abort而导致程序中断,(要尝试几次才可以彻底成功),但是如果在php-cli模式下执行,你就会发现这个程序执行的很快,php多线程执行的优势被彻底表现出来了.
备注:这种多线程方式不是很成熟,不适合大规模的生成应用,偶尔使用还是可以的
2.定时执行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命令在可以这个执行:
复制代码 代码如下:D:xamppphpphp.exe D:xampphtdocstest.php
就可以执行test.php这个文件了 。这里推荐win平台下xampp集成环境,真正比wamp强大N倍,这个集成包可以直接进入dos模式。
linux下php_cli使用
首先找到你安装php的路径,以我为例:
当然实现的方法不止一个,大家可以尝试其他方法实现!
例外关于php的cli还有很多参数可以加入:具体可以参考:http://php.net/manual/en/features.commandline.php
关于定时执行
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业,周期性作业,比如备份数据 打开/etc/crontab,添加:
复制代码 代码如下:
/usr/bin/php -f /data/htdocs/test.php
③ PHP里的output_buffering 怎么开启
在PHP.INI可以设置以下与输出缓冲有关的:
名称 默认值 作用范围 修正记录
output_buffering "0" PHP_INI_PERDIR
output_handler NULL PHP_INI_PERDIR 自 PHP 4.0.4 起可用
implicit_flush "0" PHP_INI_ALL 在 PHP <= 4.2.3 版本中是 PHP_INI_PERDIR
简单解释如下:
output_buffering boolean/integer
该选项设置为 On 时,将在所有的脚本中使用输出控制。如果要限制输出缓冲区的最大值,可将该选项设定为指定的最大字节数(例如 output_buffering=4096)。从PHP 4.3.5 版开始,该选项在 PHP-CLI 下总是为 Off。
output_handler string
该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
注意: 不能同时使用 mb_output_handler() 和 ob_iconv_handler(),也不能同时使用 ob_gzhandler() 和 zlib.output_compression。
注意: 只有内置函数可以使用此指令。对于用户定义的函数,使用 ob_start()。
implicit_flush boolean
默认为 FALSE。如将该选项改为 TRUE,PHP 将使输出层,在每段信息块输出后,自动刷新。这等同于在每次使用 print()、echo() 等函数或每个 HTML 块之后,调用 PHP 中的 flush() 函数。
不在web环境中使用 PHP 时,打开这个选项对程序执行的性能有严重的影响,通常只推荐在调试时使用。在 CLI SAPI 的执行模式下,该标记默认为 TRUE。
参见 ob_implicit_flush()。
设置了肯定会有用的,除非你修改的PHP.INI位置不是系统使用的那个,比如一般是C::\WINDOWS\PHP.INI,当然可以设置到其它地方。另外控制台程序是不缓冲的。
另外,你还可以在程序里面控制输出缓冲,请参考手册里面的“CXIV. Output Control 输出控制函数”那一章,主要有如下函数:
flush -- 刷新输出缓冲
ob_clean -- Clean (erase) the output buffer
ob_end_clean -- Clean (erase) the output buffer and turn off output buffering
ob_end_flush -- Flush (send) the output buffer and turn off output buffering
ob_flush -- Flush (send) the output buffer
ob_get_clean -- Get current buffer contents and delete current output buffer
ob_get_contents -- Return the contents of the output buffer
ob_get_flush -- Flush the output buffer, return it as a string and turn off output buffering
ob_get_length -- Return the length of the output buffer
ob_get_level -- Return the nesting level of the output buffering mechanism
ob_get_status -- Get status of output buffers
ob_gzhandler -- ob_start callback function to gzip output buffer
ob_implicit_flush -- Turn implicit flush on/off
ob_list_handlers -- List all output handlers in use
ob_start -- Turn on output buffering
output_add_rewrite_var -- Add URL rewriter values
output_reset_rewrite_vars -- Reset URL rewriter values
例子程序:
<?php
ob_start();
echo "Hello\n";
setcookie("cookiename", "cookiedata");
ob_end_flush();
?>
④ 编译php时make ZEND_EXTRA_LIBS='-liconv'这句命令中ZEND_EXTRA_LIBS='-liconv'起什么作用呢
如果不加make ZEND_EXTRA_LIBS='-liconv' ,在编译php的时候,config可能没有问题,但在make的时候可能出现undefined reference to `libiconv_open'
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1
所以为了解决这个问题,需要使用make ZEND_EXTRA_LIBS='-liconv'