急问:PHP中怎么实现“暂停”“继续”按钮的功能?? 通过调用PHP完成某操作,但由于操作时间很长,希望能在页面上提供“暂停”或“停止”按钮手动中断此操作,就像“上传文件”时的“取消”按钮一样。比如在MFC中可以通过多线程来实现,在PHP中应该怎么实现呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 wwx840723: 试过JS实现显示操作的进度条,但是一旦操作开始,没有办法让它根据外部的干预而暂停。能否说得详尽些?MFC那种可以通过多线程控制同一个事件Event,在函数中可以通过读Event的状态来决定操作是否暂停或者停止,但是PHP中似乎没有这种东西,实在不知道怎么实现ashchen:怎么做到函数暂停啊?通过外界摁按钮这样的操作,倾听ing wasuka:Cancel怎么实现啊?感觉和pause比较像。能不能详细的说说?谢了 首先谢谢ashchen:你说的这个方法我也试过,但是不行。php脚本一旦开始执行,到结束之前,这段时间用的值始终是最初读取时的值。就算中间通过暂停按钮改变了这个值,那个php脚本也不会刷新。不知道我做的是不是正确? 哎,我也有分段呀,可是在循环结束之前,getStopValue的值始终只是第一次的那个值,头疼啊for ($j=0;$j<$total;$j++){ $stop= getStopValue(); if( $stop != 1){ // 在此处进行一段操作,时间很长 ...... ...... } //刷新进度条 } getStopValue();去读一个文件啊,难道你用的变量? PHP是服务端,不是客户端不过这想法真好 ashchen:我也是通过读文件获取值的,不行啊:( 不知道你是不是之前有成功的例子,还望不吝赐教~~按说pause和stop这样的功能是很常用的,php卡在这里之前真没想到~~~我的实验代码:test1.php...//这里是html代码,用一个div显示进度<?function getStopValue(){ $fp = fopen('1.txt', 'r'); //读文件1.txt,取第一个字符 (1/0); $a = fgets($fp, 1); return (int)$a;}for ($j=0;$j<$total;$j++){ $stop= getStopValue();if( $stop != 1){ // 在此处进行一段操作,时间很长 ...... ...... } //刷新进度条 }?>然后为了确实能够在test1.php运行结束前把1.txt中的值改掉,我把stop按钮放在另一个页面test2.php 里面,运行test2.php,点击stop按钮时修改1.txt中的值。test2.php<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/transitional.dtd"><html><head> <title>***</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /></head><body><input type="button" value="stop" onclick="location.href='modify.php';" /></body></html>点test2.php中的Stop按钮,调用modify.php改变 1.txt中的值。modify.php<?$handle = fopen('1.txt',"w");//修改1.txtfwrite($handle, '1');fclose($handle);?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/transitional.dtd"><html><head> <title>动态显示服务器运行程序的进度条</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /></head><body><input type="button" value="continue" onclick=""/></body></html>结果:同时运行test1.php, test2.php,点击test2.php中的stop按钮,看到1.txt中的值确实已经变了,但是test1.php并没有停下来,仍然一直做到结束为止。 但是也只是控制它结束,continue貌似不行 <? function getStopValue(){ $fp = fopen( '1.txt ', 'r '); //读文件1.txt,取第一个字符 (1/0); $a = fgets($fp, 1); return (int)$a; } //for ($j=0;$j <$total;$j++){ ---把这句给我拿掉//修改为:while(($stop=getStopValue())==0){ sleep(1); //开始等待} // 在此处进行一段操作,时间很长 ...... ...... } //刷新进度条 } ?> 接楼上,通过一个js脚本去修改1.txt文件中的值就可以了,这个不用我教你吧。 楼主可以DIY一下,比如给php写个加载模块。里面实现这个功能。 AJAX 应用服务器端将操作分段,记录最后进度完成第一段后,在客户端用 JS 再运行第二段....如些类推~直至完成... ashchen上的说法加上ajax可以实现 应该不行的,你说的那个"取消"按钮,其实是客户端(浏览器)终止上传文件,逼得Apache不得不停止会话,但是之前上传的文件在PHP内的临时文件夹还是存在的(以上传的还在上传临时文件夹目录内),而你说的那种终止,是在PHP中运行(在服务端单方面运行后不用浏览器传输)的,而PHP是按照一条条命令执行的,所以应该没有办法。 这里有个用php实现断点续传的例子,LZ可以参考下不过这个例子讲得是下载,很好理解。你这个是上传,一定需要ajax的配合。因为整个客户端的操作需要由你写程序来实现,不能简简单单的通过表单来上传文件。 http://www.phpchina.com/bbs/viewthread.php?tid=44891 sleep可以停止n秒,暂停估计就不行了吧... 用ajax做, 用js来控制暂停和继续 php的上传文件,要中断和继续比较麻烦或不可能。但是其它服务端操作,如果该操作是可分阶段的,且状态可记录的话一般都可以用楼上说的方法暂停和继续 看你的业务逻辑了,,这是一个开发逻辑设计的问题,不是要PHP程序暂停的问题 wordpress header.php文件的疑问。 sql问题 wampserver配置问题 mysql的这个问题算蹊跷的问题吗?一个用户只能打开一个连接 请问下如何求两段时间的交集 请问,类似“http://www.iface.com.cn/sort.php/16”这样的URL是如何实现的?什么工作原理? 编译php出现的问题 如何让javascript的alert("XXXXXX")弹出对话框后页面不刷新! 请教php空值判断问题? 给书店做个电子商务网站,有N多问题请教 如何用php读取并显示这个xml文件内容? amfphp 需要怎么配置?
试过JS实现显示操作的进度条,但是一旦操作开始,没有办法让它根据外部的干预而暂停。能否说得详尽些?MFC那种可以通过多线程控制同一个事件Event,在函数中可以通过读Event的状态来决定操作是否暂停或者停止,但是PHP中似乎没有这种东西,实在不知道怎么实现ashchen:
怎么做到函数暂停啊?通过外界摁按钮这样的操作,倾听ing
能不能详细的说说?谢了
$stop= getStopValue();
if( $stop != 1){
// 在此处进行一段操作,时间很长
......
......
}
//刷新进度条
}
不过这想法真好
//这里是html代码,用一个div显示进度
<?
function getStopValue(){
$fp = fopen('1.txt', 'r'); //读文件1.txt,取第一个字符 (1/0);
$a = fgets($fp, 1);
return (int)$a;
}for ($j=0;$j<$total;$j++){
$stop= getStopValue();
if( $stop != 1){
// 在此处进行一段操作,时间很长
......
......
} //刷新进度条
}?>然后为了确实能够在test1.php运行结束前把1.txt中的值改掉,我把stop按钮放在另一个页面test2.php 里面,运行test2.php,点击stop按钮时修改1.txt中的值。test2.php<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/transitional.dtd">
<html>
<head>
<title>***</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head><body><input type="button" value="stop" onclick="location.href='modify.php';" /></body>
</html>点test2.php中的Stop按钮,调用modify.php改变 1.txt中的值。modify.php<?
$handle = fopen('1.txt',"w");//修改1.txt
fwrite($handle, '1');
fclose($handle);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/transitional.dtd">
<html>
<head>
<title>动态显示服务器运行程序的进度条</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head><body><input type="button" value="continue" onclick=""/></body>
</html>结果:同时运行test1.php, test2.php,点击test2.php中的stop按钮,看到1.txt中的值确实已经变了,但是test1.php并没有停下来,仍然一直做到结束为止。
function getStopValue(){
$fp = fopen( '1.txt ', 'r '); //读文件1.txt,取第一个字符 (1/0);
$a = fgets($fp, 1);
return (int)$a;
} //for ($j=0;$j <$total;$j++){ ---把这句给我拿掉
//修改为:
while(($stop=getStopValue())==0)
{
sleep(1);
//开始等待
}
// 在此处进行一段操作,时间很长
......
......
} //刷新进度条
} ?>
完成第一段后,在客户端用 JS 再运行第二段....如些类推~直至完成...
不过这个例子讲得是下载,很好理解。你这个是上传,一定需要ajax的配合。因为整个客户端的操作需要由你写程序来实现,不能简简单单的通过表单来上传文件。
php的上传文件,要中断和继续比较麻烦或不可能。但是其它服务端操作,
如果该操作是可分阶段的,且状态可记录的话一般都可以用楼上说的方法暂停和继续