phpstdout
1. 如何讓php和node「共存」
如你安裝了python,可以立馬執行一個簡單的命令,一個簡便的開發伺服器就完成了。
python -m SimpleHTTPServer
但是PHP,直到php5.4才支持類似的功能
$ php -S 0.0.0.0:8000
PHP 5.4.0 Development Server started at Tue Aug 21 23:21:50 2012
Listening on 0.0.0.0:8000
Document root is /home/tom
Press Ctrl-C to quit.
php本身就可以架一個伺服器,Nodejs也可以架一個伺服器,那麼就不用啥apache啦,nginx啦
基本思路就是Node開啟一個伺服器作為前台,監聽80埠,類似Apache的角色,php開啟一個伺服器在後台運行。 Node服務將http請求轉發給php伺服器執行,執行完成後返回給node伺服器,node伺服器再返回給瀏覽器
Node承擔的是一個中間的代理角色
var fs = require('fs'),
http = require('http'),
spawn = require('child_process').spawn,
phpserver;
phpserver = spawn('php',['-S','0.0.0.0:8000']);
phpserver.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
phpserver.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
phpserver.on('exit', function (code) {
console.log('child process exited with code ' + code);
});
process.on('exit',function(){
phpserver.kill('SIGHUP');
});
function handleRequest(request, response) {
var headers = {};
for(var x in request.headers){
headers[x] = request.headers[x];
}
headers['Content-Type']= 'application/x-www-form-urlencoded';
var proxy_request = http.request({
host:'localhost',
port:8000,
method:request.method,
path:request.url,
headers:headers
});
proxy_request.on('response', function (proxy_response) {
response.writeHead(proxy_response.statusCode,proxy_response.headers);
proxy_response.on('data', function(chunk) {
response.write(new Buffer(chunk));
});
proxy_response.on('end', function() {
response.end();
});
});
request.on('data', function(chunk) {
proxy_request.write(new Buffer(chunk));
});
request.on('end', function() {
proxy_request.end();
});
}
http.createServer(handleRequest).listen(80);
保存上面的文件為server.js然後在命令行里執行
node server.js
一個node和php混搭的伺服器就搭建成功了
2. PHP是怎麼進行輸入輸出的
php://stdin, php://stdout 和 php://stderr
php://stdin,php://stdout 和 php://stderr允許訪問 PHP 進程相應的輸入或者輸出流。
php://input
php://input 是個可以訪問請求的原始數據的只讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA(原生的post數據),因為它不依賴於特定的 php.ini 指令,內存消耗更少。如下例:
<formaction=method=post
<inputtype=textname=test<inputtype=submitname=/</form<?phpecho file_get_contents(php://input);?結果:
php://output
php://output 是一個只寫的數據流, 允許你以 print 和 echo 一樣的方式 寫入到輸出緩沖區。
php://fdphp://fd 允許直接訪問指定的文件描述符。 例如 php://fd/3 引用了文件描述符 3。
php://memory 和 php://temp
php://memory 和 php://temp 是一個類似文件 包裝器的數據流,允許讀寫臨時數據。 兩者的唯一區別是 php://memory 總是把數據儲存在內存中, 而 php://temp 會在內存量達到預定義的限制後(默認是 2MB)存入臨時文件中。 臨時文件位置的決定和 sys_get_temp_dir() 的方式一致。
php://filter
php://filter 是一種元封裝器, 設計用於數據流打開時的篩選過濾應用。 這對於一體式(all-in-one)的文件函數非常有用,類似 readfile()、 file() 和 file_get_contents(), 在數據流內容讀取之前沒有機會應用其他過濾器。參數如下:如下例:<?php/* 這會以大寫字母輸出的全部內容 */
3. php調用linux命令更改文件許可權
在php教程中調用linux命令的函數是
string exec(string command, string [array], int [return_var]);
如
exec( "vpopmail ");
echo exec('whoami');
再看一實例
functionexec_enabled(){
$disabled=explode(',',ini_get('disable_functions'));
return!in_array('exec',$disabled);
}
<?php
$tmp=exec("c:Imagegm.execonvertc:Imagefile1.tiffc:Imagefile1.jpg",$results);
?>
還有一種命令是
php通過函數system()調用系統命令。
stringsystem(string$command[,int&$return_var])
實例
system('asterisk-vvvvvvvvvvvc');
system()是一樣的函數C的,它執行給定的命令和輸出結果的版本。該system()的調用也嘗試自動刷新網頁伺服器的輸出緩沖器在每個輸出
行如果PHP運行作為伺服器模塊。如果你需要執行一個命令,並已全部通過直接從背面沒有任何干擾的命令數據,使用passthru()函數。
$last_line=system('ls',$retval);
functionmy_exec($cmd,$input='')
{$proc=proc_open($cmd,array(0=>array('pipe','r'),1=>array('pipe','w'),2=>array('pipe','w')),$pipes);
fwrite($pipes[0],$input);fclose($pipes[0]);
$stdout=stream_get_contents($pipes[1]);fclose($pipes[1]);
$stderr=stream_get_contents($pipes[2]);fclose($pipes[2]);
$rtn=proc_close($proc);
returnarray('stdout'=>$stdout,
'stderr'=>$stderr,
'return'=>$rtn
);
}
var_export(my_exec('echo-e$(</dev/stdin)|wc-l','h el lo'));
實例三
$cmd="date";
$output=system($cmd);
printf("SystemOutput:$output");
exec($cmd,$results);
printf("ExecOutput:{$results[0]}");
php調用linux命令的許可權問題
你可以使用定時任務執行你要調用的php,這時的許可權就是root,
php通過函數system()調用系統命令
php一般是以apache用戶身份去執行的,把apache加入到存儲你文件的父文件夾屬組里去,然後改該父文件夾許可權為775,這樣屬組成員就有寫的
許可權,而apache屬於這個組就可以改寫該目錄下所有文件的許可權,當然,屬組最好不要是root,你可以為該文件夾改個其它普通用戶組。
改apache/php的運行用戶方法不安全
4. php輸入問題
"php中的輸入只能通過html中的input等表單元素"
這個說法不正確的.
樓主要的請看例子:
vi clitest.php
1 #!/usr/bin/php
2 <?php
3 //這個是獲取命令行參數的.第一個永遠是腳本本身的名字.
4 //print_r($argv);
5
6 //這里開始是你要的.
7 fwrite(STDOUT, "input sth:");
8 $sth = trim(fgets(STDIN));
9 fwrite(STDOUT, "output: $sth \n");
10 ?>
運行:
[rainbyte@localhost bin]$ ./clitest.php
input sth:test
output: test
如果是windows下建議用:
php -q clitest.php
-q是安靜模式,不輸出HTTP頭.
5. PHP中當點擊一個下載超鏈接時自動進行迅雷下載,這是怎麼實現的
這個是和瀏覽器相關的 不是和你的網頁代碼有關的 是瀏覽器中裝了迅雷的組建或者說是插件 他監控了你的點擊事件 撲捉到如果是。rar或者。zip之類的就會自動打開迅雷把地址復制到迅雷的新建任務中用迅雷下載.
6. PHP和Nodejs能配合使用嗎
可以,如何實現不是很清楚,具體案例為drupal的nodejs模塊,以及若干依賴於此nodejs模塊的其他模塊,比如一些即時聊天的模塊就可以選擇性的依賴於nodejs模塊
7. PHP接受命令參數
一、使用$argv or $argc參數接收
復制代碼代碼如下:
<?php
/**
* 使用 $argc $argv 接受參數
*/
echo "接收到{$argc}個參數";
print_r($argv);
執行
復制代碼代碼如下:
[root@DELL113 lee]# /usr/local/php/bin/php test.php
接收到1個參數Array
(
[0] => test.php
)
[root@DELL113 lee]# /usr/local/php/bin/php test.php a b c d
接收到5個參數Array
(
[0] => test.php
[1] => a
[2] => b
[3] => c
[4] => d
)
[root@DELL113 lee]#
二、使用getopt函數
復制代碼代碼如下:
<?php
/**
* 使用 getopt函數
*/
$param_arr = getopt('a:b:');
print_r($param_arr);
執行
復制代碼代碼如下:
[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345
Array
(
[a] => 345
)
[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345 -b 12q3
Array
(
[a] => 345
[b] => 12q3
)
[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345 -b 12q3 -e 3322ff
Array
(
[a] => 345
[b] => 12q3
)
三、提示用戶輸入
復制代碼代碼如下:
<?php
/**
* 提示用戶輸入,類似Python
*/
fwrite(STDOUT,'請輸入您的博客名:');
echo '您輸入的信息是:'.fgets(STDIN);
執行
復制代碼代碼如下:
[root@DELL113 lee]# /usr/local/php/bin/php test.php
請輸入您的博客名:腳本之家 www.jb51.net
您輸入的信息是:腳本之家 www.jb51.net
你也可以這么干,不讓用戶輸入空信息
復制代碼代碼如下:
<?php
/**
* 提示用戶輸入,類似Python
*/
$fs = true;
do{
oif($fs){
fwrite(STDOUT,'請輸入您的博客名:');
$fs = false;
}else{
fwrite(STDOUT,'抱歉,博客名不能為空,請重新輸入您的博客名:');
}
$name = trim(fgets(STDIN));
}while(!$name);
echo '您輸入的信息是:'.$name."\r\n";
8. 如何在命令行下運行PHP腳本[帶參數]
.php:<?phpecho "Hello from the CLI";?現在,試著在命令行提示符下運行這個程序,方法是調用CLI可執行文件並提供腳本的文件名: #php phphello.php 輸出Hello from the CLI ----------------- 使用標準的輸入和輸出 你可以在自己的PHP腳本里使用這三個常量,以接受用戶的輸入,或者顯示處理和計算的結果。要更好地理解這一點,可以看看下面的腳本(列表A):列表A<?php// ask for input fwrite(STDOUT, "Enter your name: "); // get input $name = trim(fgets(STDIN)); // write input back fwrite(STDOUT, "Hello, $name!");?Look what happens when you run it: shell php hello.php Enter your name: Joe Hello, Joe! 在這個腳本里,fwrite()函數首先會向標準的輸出設備寫一條消息,詢問用戶的姓名。然後它會把從標准輸入設備獲得的用戶輸入信息讀 取到一個PHP變數里,並它把合並成為一個字元串。然後就用fwrite()把這個字元串列印輸出到標準的輸出設備上。 ----------------- 使用命令行自變數 在命令行里輸入程序參數來更改其運行方式是很常見的做法。你也可以對CLI程序這樣做。PHP CLI帶有兩個特殊的變數,專門用來達到這個目的:一個是$argv變數,它通過命令行把傳遞給PHP腳本的參數保存為單獨的數組元素;另一個是$argc變數,它用來保存$argv數組里元素的個數。 shell php phptest.php chocolate 276 "killer tie, de!"Array( [0] = test.php [1] = chocolate[2] = 276[3] = killer tie, de!)正如你可以從輸出的結果看到的,傳遞給test.php的值會自動地作為數組元素出現在$argv里。 要注意的是,$argvis的第一個自變數總是 腳本自己的名稱。 下面是一個更加復雜的例子(列表C):列表C代碼 下面是其用法的示例: shell php phpbook.php 21/05/2005 7 single 在這里,腳本首先會檢查$argc,以確保自變數的數量符合要求。它然後會從$argv里提取出每一個自變數,把它們列印輸出到標準的輸出
9. 如何將STDOUT重定向到PHP中的文件
使用下面的調用:
freopen( "file.txt", "a+", stdout );
此語句使所有的後續輸出,通常定向到轉到文件 FILE.TXT stdout,向。
若要返回到顯示默認 stdout) 的 stdout,使用下面的調用:
freopen( "CON", "w", stdout );
在這兩種情況下檢查 freopen() 以確保重定向實際發生的返回值。
FILE *stream ;
if((stream = freopen("file.txt", "w", stdout)) == NULL)
exit(-1);
printf("this is stdout output\n");
---------------------------------------------------------------------------
將其定義為函數:在linux下:
void myprintf(char *s)
{
FILE *stream;
stream=freopen("/var/log/messages","a+",stdout);
printf("%s\n",s);
}
直接調用:myprintf("this is the test!");
10. php猜數字代碼
猜數游戲有兩種玩法:
第一種:兩個人玩,一方出數字,一方猜。出數字的人要想好一個指定位數的數,數字可重復,不能讓猜的人知道。
猜的人就可以開始猜。每猜一個數,出數者就要說大過或小過出的數。
第二種:兩個人玩,一方出數字,一方猜。出數字的人要先想好一個沒有重復數字的4位數,不能讓猜的人知道。猜的
人就可以開始猜。每猜一個數,出數者就要根據這個數字給出幾A幾B,其中A前面的數字表示位置正確的數的個數,而
B前的數字表示數字正確而位置不對的數的個數。如正確答案為5234,而猜的人猜5346,則是1A2B,其中有一個5的位
置對了,記為1A,而3和4這兩個數字對了,而位置沒對,因此記為2B,合起來就是1A2B。接著猜的人再根據出題者的
幾A幾B繼續猜,直到猜中為止。
下面是PHP代碼實現:
<?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{
//判斷幾A幾B
$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;//幾A
$bval=0;//幾B
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;
}