① php的几种运行模式
php一共分为五大运行模式:包括cgi 、fast-cgi、cli、isapi、apache 模块的 DLLCGI
CGI即通用网关接口(Common Gateway Interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执 行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。
CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi 方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU时间等,造成效能低下。CGI-FCGI
fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。FastCGI的工作原理
1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Mole)
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4、 FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。在上述情况中,你可以想象CGI通常有多慢。每一个Web 请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的 好处是,持续数据库连接(Persistent database connection)可以工作。APACHE2HANDLER
PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计 算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。
apache模块的DLL:
该运行模式是我们以前在windows环境下使用apache服务器经常使用的,而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。(是apache在CGI的基础上进行的一种扩展,加快PHP的运行效率)ISAPI:
ISAPI即Internet Server Application Program Interface,是微软提供的一套面向Internet服务的API接口
一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,
ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显着高于CGI。(由于微软的排他性,只能运行于windows环境)cli:
cli是php的命令行运行模式,大家经常会使用它,但是可能并没有注意到(例如:我们在linux下经常使用 “php -m”查找PHP安装了那些扩展就是PHP命令行运行模式;有兴趣的同学可以输入php -h去深入研究该运行模式)总结:
每种运行模式都有自己的优缺点,没有绝对的好与坏,主要是看大家处理何种环境。
② 如何用PHP运行批处理<.bat>文件或者结束服务器进程
可以用system()、exec()、passthru()
string
system
(
string
command
[,
int
&return_var]
)
string
exec
(
string
command
[,
array
&output
[,
int
&return_var]]
)
void
passthru
(
string
command
[,
int
&return_var]
)
没错啊,比如你要在用户访问1.php的时候执行服务器上的
c:\a.bat
你可以在1.php里面这么写
?php
exec("c:\\a.bat");
?
③ 要一个能播放视频文件的php 源码,能制“播放”“暂停”“停止”等
这个播放视频确实是前端控制的,如果你想简单点的话,那就搜搜html5里的video,这个元素能够播放视频,还能通过js来控制,比如获取当前影片的总时长和播放时长,便于下次的续播,等等。
给你看看这段代码
===================
<!DOCTYPE HTML>
<html>
<head>
<title>html5_video</title>
<meta charset="UTF-8"/>
</head>
<body>
<div>
<video id="video" width="400" height="300" controls="controls">
<source src="mov_bbb.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
</div>
<div id="check"></div>
<input type="button" id="change" value="播放" />
</html>
<script type="text/javascript">
/*
可以为video添加的事件还有很多,比如:
error 视频加载时发生错误
progress 正在加载视频时
loadstart 浏览器开始加载视频元素时
volumechange音量被改变时
当然,video自己本身还有一些事件和属性
startTime float 开始播放时间
currentTime float 获取或设定当前视频的播放时间
ration float 视频的总播放时长
paused boolean 当前影片是否处于暂停状态
ended boolean 影片是否已结束
volume int 获取或设置音量
pause() 使影片暂停
play() 使影片播放
*/
var video = document.getElementById("video");
var check = document.getElementById("check");
var change = document.getElementById("change");
//暂停事件
video.addEventListener("pause", function(){
var msg = "处于暂停状态,当前播放时间为:"+video.currentTime;
check.innerHTML = msg;
});
//播放事件
video.addEventListener("playing", function(){
var msg = "开始播放,从"+video.currentTime+"播放";
check.innerHTML = msg;
});
//正在拖动播放条事件
video.addEventListener("seeking", function(){
var msg = "正在拖动";
check.innerHTML = msg;
});
//拖动播放条结束事件
video.addEventListener("seeked", function(){
var msg = "拖动结束";
check.innerHTML = msg;
});
//视频结束时
video.addEventListener("ended", function(){
var msg = "视频已播放完毕,总时长为:"+video.ration;
check.innerHTML = msg;
});
change.addEventListener("click", function(){
if(video.paused){
video.play();
change.value = "暂停";
}else{
video.pause();
change.value = "播放";
}
})
</script>
④ php运行机制是什么
PHP是一种纯解释型在服务端执行的可以内嵌HTML的脚本语言,尤其适合开发Web应用程序。
请求一个 PHP 脚本时,PHP 会读取该脚本,并将其编译为 Zend 操作码,这是要执行的代码的一种二进制表示形式。随后,此操作码由 PHP 执行并丢弃。 PHP脚本在每次被解释时进行初始化,在解释完毕后终止运行。这种运行是互相独立的,每一次请求都会创建一个单独的进程或线程,来解释相应的页面文件。页面创建的变量和其他对象,都只在当前的页面内部可见,无法跨越页面访问。在终止运行后,页面中申请的、没有被代码显式释放的外部资源,包括内存、数据库连接、文件句柄、Socket连接等,都会被强行释放。也就是说,PHP无法在语言级别上实现直接访问跨越页面的变量,也无法创建驻留内存的对象。
PHP这种独特的工作模型的优势在于,基本上解决了令人头疼的资源泄漏问题。Web应用的特点是大量的、短时间的并发处理,对各种资源的申请和释放工作非常频繁,很容易导致泄漏甚至崩溃。PHP的运行机制决定它不存在常规的崩溃问题(顶多连接超时脚本停止执行),可以说PHP是较稳定的Web应用。但是,这种机制的缺点也非常明显。最直接的后果是,PHP在语言级别无法实现跨页面的缓冲机制。这种缓冲机制缺失造成的影响,可以分成两个方面:
一是对象的缓冲。众所周知,很多设计模式都依赖于对象的缓冲机制,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源,对于需要频繁应付大量并发的服务端软件更是如此。因此,对象缓冲的缺失,理论上会极大地降低速度。应尽可能减少创建和销毁对象的次数来提高服务程序的效率,由于 PHP目前还不支持多线程,也就无法像Java一样通过线程池调度来弥补这一缺陷;但可以使用第三方软件如Memcachd来实现PHP的对象缓冲机制,达到减少对象创建和销毁的时间来提高服务程序的效率。Memcachd将PHP编译后的 操作码缓存并在内存中保存这个操作码,并在下一次调用该页面时重用它,这会节省很多时间。比较常用的缓存还有有 eAccelerator,另一种流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。
二是数据库连接的缓冲。对于MySQL,PHP提供了一种内置的数据库缓冲机制,即用mysql_pconnect()代替mysql_connect() 来打开数据库而已。PHP会自动回收被废弃的数据库连接,以供重复使用。在实际应用中,这种持久性数据库连接往往会导致数据库连接的伪泄漏现象:在某个时间,并发的数据库连接过多,超过了MySQL的最大连接数,从而导致新的进程无法连接数据库。但是过一段时间,当并发数减少时,PHP会释放掉一些连接,网站又会恢复正常。出现这种现象的原因是,当使用pconnect时,Apache 的httpd进程会不释放connect,而当Apache的httpd进程数超过了mysql的最大连接数时,就会出现无法连接的情况。因此,需要小心地调整Apache和Mysql的配置,以使Apache的httpd进程数不会超出MySQL的最大连接数。笔者经过实践,在PHP5和 Oracle10g的连接中,由于频于数据库连接,有时候还会出现数据库丢失连接的情况(Oracle官方有针对PHP的增强包,不知是否可以解决此问题,笔者未试)。
PHP的工作模型即是缺点也是优势,从本质上说,这就是PHP 的独特之处。
若以FastCGI模式运行php,解析php.ini、载入全部扩展并重初始化全部数据结构这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接可以工作。Nginx+PHP(FastCGI)是个不错的选择。
⑤ PHP中有没有强行结束服务器上某个程序的方法啊
当然可以停止某个程序,不过你的PHP是由WEB服务器调用的,要停止WEB服务器才有效。
在WINDOWS系列服务器下,停止WEB服务器可以使用NET STOP命令,UNIX系统服务器可以调用APACHE的停止(HTTPD -K STOP),或者使用KILL进程。
补充:
你还是没有说服务器类型,我还是只有泛泛而谈了:上面说的用命令解释进行控制,这些命令是可以在PHP文件里面发出的,比如:
<?php
system("apacgectl -k restart");
?>
当然,最好的办法是编写无错的程序,或者设置较小的超时值,程序开头写下面语句:
set_time_limt(10);