开发者社区> 问答> 正文

php同一个会话之间可以共享同一个对象实例吗?? 400 报错

php同一个会话之间可以共享同一个对象实例吗?? 400 报错

是接着上一个问题的:http://www.oschina.net/question/1182150_211947

好像没人答啊!

其实是同一个问题,我是想把socket操作的那部分写在类里面,然后在各个http请求之间共享这个实例。

这样可以吗?怎么做?

展开
收起
爱吃鱼的程序员 2020-06-03 17:08:21 520 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    socket可以共享,通过 pfsockopen或者stream_socket_client+STREAM_CLIENT_PERSISTENT都可以打开一个持久的socket链接。但是对象多个会话无法共享######不用保存链接,直接调用pfsockopen即可######我是指同一个会话,不同的http请求之间。 socket的持久连接怎么共享?连接句柄保存到session吗?######php没有java的application全局对象实例,只有session和request级别的共享数据
    ######所以我想是不是可以把对象序列化后存到session,然后再反序列化回来,不知道行不行?######

    php 在 请求开始的时候打开session,在请求结束后回写session,所以并发的两个请求对session的操作是各做各的。

    你想操作共享数据可以看看这个Shmop,也可以操作redis之类的缓存。

    ######

    看了你上一个帖子,嗯,还是放弃吧少年,你可以了解下PHP的资源类型,句柄指向的资源都关闭了,你序列化反序列化又有什么意义呢?


    ######回复 @淫监会主席 : 那你可以开一个php_cli来转接啊,不用php也行,因为php可能会有内存泄漏之类的问题。######回复 @xia-yongsheng : 不是我一定要,是业务需要这样子!C++的服务器又没有考虑到php做不到!######回复 @淫监会主席 : 不可以。你为何一定要这样?######回复 @xia-yongsheng : 我可以把stream资源缓存起来共享吗?######回复 @淫监会主席 : 这个不会关闭只是在一个PHP进程内能用,你确定每次请求都是进入这个进程?你可以去了解php各个sapi下的module_init module_shutdown,以及request_init,request_shutdown的关系######

    PHP是一门stateless的语言。所以在各个HTTP请求间共享一个实例,默认是不可以的。

    可以借助redis,memcahce等插件,持久化需要在多个HTTP请求间共享的数据。我自己经常使用apc。

    // 在一个脚本中放入
    apc_add('shared', array('foo' => 'bar'));
    // 在另一个脚本里取出
    $shared = apc_fetch('shared');



    ######你这个apc是缓存opcode的扩展吗?######保存到数据库中,文件中都可以。上面提什么apc, memcache,就是在误导楼主了。######object通过serialize序列化成string,然后保存到会话变量中:
    $_SESSION[' instance'] = serialize($object);
    在使用这个会话(PHPSESSID)发出的其他http请求反序列化获取对象:
    $object = unserialize($_SESSION[' instance']);
    2020-06-03 20:34:31
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载