通过调用PHP完成某操作,但由于操作时间很长,希望能在页面上提供“暂停”或“停止”按钮手动中断此操作,就像“上传文件”时的“取消”按钮一样。比如在MFC中可以通过多线程来实现,在PHP中应该怎么实现呢?

解决方案 »

  1.   

    wwx840723: 
    试过JS实现显示操作的进度条,但是一旦操作开始,没有办法让它根据外部的干预而暂停。能否说得详尽些?MFC那种可以通过多线程控制同一个事件Event,在函数中可以通过读Event的状态来决定操作是否暂停或者停止,但是PHP中似乎没有这种东西,实在不知道怎么实现ashchen:
    怎么做到函数暂停啊?通过外界摁按钮这样的操作,倾听ing
      

  2.   

    wasuka:Cancel怎么实现啊?感觉和pause比较像。
    能不能详细的说说?谢了
      

  3.   

    首先谢谢ashchen:你说的这个方法我也试过,但是不行。php脚本一旦开始执行,到结束之前,这段时间用的值始终是最初读取时的值。就算中间通过暂停按钮改变了这个值,那个php脚本也不会刷新。不知道我做的是不是正确?
      

  4.   

    哎,我也有分段呀,可是在循环结束之前,getStopValue的值始终只是第一次的那个值,头疼啊for ($j=0;$j<$total;$j++){  
    $stop= getStopValue();
    if( $stop != 1){
       //  在此处进行一段操作,时间很长
                   ......
                   ......
      
    }

             //刷新进度条   
       
     }
      

  5.   

    getStopValue();去读一个文件啊,难道你用的变量?
      

  6.   

    PHP是服务端,不是客户端
    不过这想法真好
      

  7.   

    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.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并没有停下来,仍然一直做到结束为止。
      

  8.   

    但是也只是控制它结束,continue貌似不行
      

  9.   

    <? 
    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);
     //开始等待

          
    //     在此处进行一段操作,时间很长 
                                  ...... 
                                  ...... 
        
    }                   //刷新进度条     
          
      } ?> 
      

  10.   

    接楼上,通过一个js脚本去修改1.txt文件中的值就可以了,这个不用我教你吧。
      

  11.   

    楼主可以DIY一下,比如给php写个加载模块。里面实现这个功能。
      

  12.   

    AJAX 应用服务器端将操作分段,记录最后进度
    完成第一段后,在客户端用 JS 再运行第二段....如些类推~直至完成...
      

  13.   

    ashchen上的说法加上ajax可以实现
      

  14.   

    应该不行的,你说的那个"取消"按钮,其实是客户端(浏览器)终止上传文件,逼得Apache不得不停止会话,但是之前上传的文件在PHP内的临时文件夹还是存在的(以上传的还在上传临时文件夹目录内),而你说的那种终止,是在PHP中运行(在服务端单方面运行后不用浏览器传输)的,而PHP是按照一条条命令执行的,所以应该没有办法。
      

  15.   

    这里有个用php实现断点续传的例子,LZ可以参考下
    不过这个例子讲得是下载,很好理解。你这个是上传,一定需要ajax的配合。因为整个客户端的操作需要由你写程序来实现,不能简简单单的通过表单来上传文件。
      

  16.   

    http://www.phpchina.com/bbs/viewthread.php?tid=44891
      

  17.   

    sleep可以停止n秒,暂停估计就不行了吧...
      

  18.   

    用ajax做, 用js来控制暂停和继续
      

  19.   


    php的上传文件,要中断和继续比较麻烦或不可能。但是其它服务端操作,
    如果该操作是可分阶段的,且状态可记录的话一般都可以用楼上说的方法暂停和继续
      

  20.   

    看你的业务逻辑了,,这是一个开发逻辑设计的问题,不是要PHP程序暂停的问题