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;
}