想做这样的功能
session_start();
if(isset($_SESSION["proc"]))
    $_SESSION["proc"] = proc_open(...);
if(isset($_SESSION["file"]))
    $_SESSION["file"] = fopen(...);
// 使用$_SESSION["proc"]
// 使用$_SESSION["file"]如何做到每个session只打开一次对象,下次再操作就不再打开了,当上面这样写是没用的查了PHP手册说:自从4.2后除了数据库连接需要手动关闭,其他资源都会自动关闭,经测试确实如此。
有办法可以延长资源的生命周期到会话级,从而在不同页面请求之间共享吗?

解决方案 »

  1.   

    SESSION里保存的只能是可序列化的资源,像INODE的就不行了非得这样的话,第一反应有两个方式,一个是不用php。。第二个,稍微靠谱点,你可以写一个值守进程,监听特定端口。由php去连接该端口,建立session时通知打开文件,需要访问时发送相应的指令并接收回应来完成各种资源的读写操作。
      

  2.   

    其实proc file是存下来了,可文件和程序还是关闭了,再拿到句柄也不能用了啊
      

  3.   

    我也想过这个问题 毕竟有很多资源都是可以重用的 反反复复的关闭再打开降低效率 但是php里貌似没有比较完美的解决方案  好麻烦
      

  4.   

    session不是可以设置时长的吗? 把它设长一点啊。还可以存到内存中,缓存中。可以往这些方面去考虑。
      

  5.   

    5L:
    往session中存个资源对象比存个字符串数字什么的难多了啊其实主要是资源关闭的问题
      

  6.   

    主要是打开的文件句柄会在php执行完后被释放,光在session里保存了一个句柄无法重用。。而且,如果通过破坏这个机制让session长期保存,还要考虑到内存泄漏的问题吧,打开句柄时会申请一定的内存,而永久保存在session里不释放,会让内存占用一直增加。如果通过定期回收工作进程的方式来防止内存泄露,那么回收工作进程时该进程打开的资源同样会被关闭,依然回到了最开始的问题。
      

  7.   

    PHP手册上说 Zend内核提供引用计数方式的自动关闭资源功能,但这压根不是引用技术么,这就像是C++里面类对象在函数结尾时自动调用析构么,这和引用计数也差太远了
      

  8.   

    10L:
       sorry 我理解错你的意思了!我的理解交互式程序,每个人上来的时候都应该是一个单独的进程啊,如果你把所有的这些句柄都存起来,期望每个进来的人都共用,那是不是更应该多的是考虑多线程的问题。
      

  9.   

    确实打算让每个会话启动时打开程序,中途对stdin输入交互数据,会话销毁时关闭程序,这样也是比较自然的想法。若是不用PHP,换其他网页语言不知道能不能达到这个要求呢?
      

  10.   

    提出问题,发出疑问都是很正常的!
    但是作出结论时就要慎重了,先要问一下:自己到底知道了多少你自己观察以下代码的运行情况,就应该有数了t.php
    <?php
    class T {
      var $v = 0;
      function show() {
        echo $this->v;
      }
    }t1.php
    <?php
    include 't.php';
    session_start();
    if(! isset($_SESSION["obj"]))
      $_SESSION["obj"] = new T;$_SESSION["obj"]->show();
    $_SESSION["obj"]->v++;echo <<< HTML
    <p>$_SERVER[PHP_SELF]</p>
    <a href=t1.php>T1</a><br>
    <a href=t2.php>T2</a><br>
    HTML;t2.php
    <?php
    include 't.php';
    session_start();
    if(! isset($_SESSION["obj"]))
      $_SESSION["obj"] = new T;$_SESSION["obj"]->show();
    $_SESSION["obj"]->v++;echo <<< HTML
    <p>$_SERVER[PHP_SELF]</p>
    <a href=t1.php>T1</a><br>
    <a href=t2.php>T2</a><br>
    HTML;
      

  11.   


    跟class没关系,class是php运行时对象,可以序列化的。而fopen得到的句柄存到session里是能重复使用的。
      

  12.   

    貌似这功能PHP做不到啊,我在试着用BCB的IdHTTPServer做了
      

  13.   

    不是PHP做不到可以写个PHP扩展,专门全Application级别的全局变量嘛 呵呵
      

  14.   

    BCB IndyPTTP做不稳定,多线程请求还是很复杂的,先结了,其实PHP扩展也是可以考虑的,功能不是很复杂有个框架就行了,没工夫去做了,问题先结了,谢谢大家