如何在 AJAX 调用之间保持 PHP 对象处于活动状态(或在内存中)

Posted

技术标签:

【中文标题】如何在 AJAX 调用之间保持 PHP 对象处于活动状态(或在内存中)【英文标题】:How to keep PHP object alive (or in memory) between AJAX calls 【发布时间】:2017-03-14 02:06:05 【问题描述】:

我有以下类定义:

class DatasegmentationController

    public function indexAction()
    
        $options['permissions'] = array(
            'canDelete'     => false,
            'canEdit'       => false
        );

        if ($this->getRequest()->isXmlHttpRequest()) 
            $table = $this->getRequest()->getParam('table');

            if ($table !== '' && $table !== null) 
                $utilStr = new UtilString();

                // This is a patch because class and tables names does not match
                // so far it only happens with company and this is only for
                // instantiate the proper class dynamically
                $param_table = $table;
                $table       = $table === 'companies' ? 'company' : $table;
                $classObj    = strpos($table, '_') !== false ? $utilStr->stringToCamelCase($table, '_') : $utilStr->stringToCamelCase($table);
                $className   = new $classObj();

                $module_map = $field_map[$param_table];

                /** @var  $module_map array */
                $fields = [];
                foreach ($module_map as $key => $value) 
                    $fields[] = [
                        'id'   => $key,
                        'text' => $key
                    ];
                

                $conditions      = json_decode($this->_request->getParam('conditions'), true);
                $dynDataGridName = "DataSegmentation$this->classObjGrid";
                $dynMethodName   = "get$this->classObjGridModel";

                $gridObj = new $dynDataGridName(
                    $this->className->$dynMethodName($conditions),
                    $this->view->users_id,
                    "$table_list",
                    "$table.$table_id",
                    '/datasegmentation/index',
                    'editor',
                    $options
                );

                return $this->_helper->json([
                    'fields' => $fields,
                    'grid'   => $gridObj->getGridJs()
                ]);
            

            if (isset($classObj, $className, $gridObj)) 
                $page  = $this->_request->getParam('page', 1);
                $limit = $this->_request->getParam('rows', 20);
                $col   = $this->_request->getParam('sidx', 1);
                $order = $this->_request->getParam('sord', 0);
                $search  = $this->_request->getParam('val', null);

                echo $gridObj->getData($page, $limit, $col, $order, $search);
            
        
    

以上代码的作用如下:

URL http://localhost/datasegmentation 被调用 视图呈现一个带有选项的选择元素 (modules) select#modules 更改后,我将其值作为 URL 的一部分发送,因此下一个 AJAX 调用变为:http://localhost/datasegmentation?table=companies(例如) indexAction() 函数然后在$table 不为空或不为空时执行条件 在所有这些东西中,它尝试动态生成所有内容,正如您在代码中可能注意到的那样。 其中一个东西是一个动态网格 ($gridObj),它有一个对相同 indexAction() 的 AJAX 调用,但没有用于在渲染后填充数据的参数 在视图中呈现网格后,它会进行 AJAX 调用,并再次调用 indexAction() 并跳过表的条件,因为未设置参数并尝试第二个条件,但令人惊讶的是它失败了,因为对象需要工作的代码已经消失了。

遇到这种情况,我的问题是:

如何让对象在 AJAX 调用之间保持活动状态?存储在会话变量中?还有其他解决方法吗? 如果答案是将它们存储在会话变量中,是否值得推荐? this、this 和 this 等的答案呢? 您将如何处理?

问题

第二个 AJAX 调用是向网格添加数据的调用,它依赖于动态参数。这是我需要解决的问题。

我不知道这是否有用,但这是在 Zend Framework 1 项目之上使用 php 5.5.x 进行测试和开发的。

【问题讨论】:

你没有。将对象粘贴到会话中将其序列化为文本格式,然后在您想要使用它时将其反序列化。没有办法让对象保持活动状态,因为这违背了 PHP 的设计。与所有事情一样,有 种方法可以做到这一点,但问题是 - 你要解决什么问题?这是一个明显的 XY 问题,并且没有理由让您寻求这种可感知的解决方案 - 无法提供适当的帮助。 @N.B.再次阅读更新的 OP,其中说 Why? 这就是我想要弄清楚的 所以保存这些值并使用它们来创建您需要的任何对象。为什么需要内存中的对象?将足够的数据保存到会话以允许您创建所需的任何对象有什么问题?你想多了。 什么不推荐?要使用值,您需要创建解决问题的编程结构?为什么不建议这样做?因为有意义?为什么要听白痴的?根据这些人的建议,替代方案是什么?将 PHP 用于它不是为了什么?即使您能够将对象存储在内存中,您也会为这样一个在大多数情况下甚至没有意义的功能付出如此多的代价......质疑一切。甚至我的cmets。 :) 您可能会研究某种缓存机制,例如 memcache 或 redis,以利用内存存储。您可能还可以使用 php 必须的序列化和反序列化函数来来回序列化对象。请记住,序列化/反序列化将从字符串重构您的对象,这意味着您将丢失类中使用的任何引用(文件指针、数据库连接等)。 【参考方案1】:

如何在 AJAX 调用之间保持对象的活动状态?存储在一个 会话变量?还有其他解决方法吗?

将数据存储在会话变量中 使用客户端 ID(可以是登录名、随机数、IP 等)将数据存储在文件中 将数据存储在数据库中。

如果答案是将它们存储在会话变量中,是否值得推荐? 关于这个、这个和这个等等的答案呢?

如果您要存储关键数据,请使用端到端加密、SSL、HTTPS。

你会怎么处理?

使用会话变量。

【讨论】:

以上是关于如何在 AJAX 调用之间保持 PHP 对象处于活动状态(或在内存中)的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Ajax 调用使会话保持活动状态?

JQuery Ajax - 如何在进行 Ajax 调用时检测网络连接错误

JNI 保持对对象的全局引用,并使用其他 JNI 方法访问它。在多个 JNI 调用中保持 C++ 对象处于活动状态

如何通过 ajax php 调用返回包含 json 对象的数组/json 对象?

如何在 Android 中服务 onDestroy 后保持对象变量处于活动状态?

就jQuery ajax调用而言,php echo和return之间的区别[关闭]