【问题标题】:Does PHP copy variables when retrieving from shared memory?PHP 从共享内存中检索时是否复制变量?
【发布时间】:2009-11-06 03:17:34
【问题描述】:

如果我运行 shm_get_var(),它会返回一个“引用”,将数据保存在共享内存中吗?

我想在共享内存中保留一个大小约为 50MB 的数组,以便多个进程可以使用它,而不必保留这个 50MB 数组的多个副本。如果共享内存不是答案,还有人有其他想法吗?

【问题讨论】:

    标签: php arrays data-structures shared-memory


    【解决方案1】:

    这是 PHP 5.2.9 中来自 sysvsem.c 的相关 C 代码 sn-p :

    /* setup string-variable and serialize */
    /* get serialized variable from shared memory */
    shm_varpos = php_check_shm_data((shm_list_ptr->ptr), key);
    
    if (shm_varpos < 0) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable key %ld doesn't exist", key);
        RETURN_FALSE;
    }
    shm_var = (sysvshm_chunk*) ((char *)shm_list_ptr->ptr + shm_varpos);
    shm_data = &shm_var->mem;
    
    PHP_VAR_UNSERIALIZE_INIT(var_hash);
    if (php_var_unserialize(&return_value, (const unsigned char **) &shm_data, shm_data + shm_var->length, &var_hash TSRMLS_CC) != 1) {
        PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable data in shared memory is corrupted");
        RETURN_FALSE;
    }
    PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
    

    每次调用 shm_get 时,PHP 都必须反序列化整个值,这在 50MB 数组上会非常慢。

    如何将其分解为单独的值?

    您可能还需要考虑使用 APC 的变量缓存,它将为您处理所有共享内存和锁定(并且还将使用哈希表进行键查找)

    【讨论】:

      【解决方案2】:

      我不是这方面的专家,但是否可以为此编写一个类似以下的快速测试?

      $key = 1234;
      //put something small into shared memory
      $identifier = shm_attach($key, 1024, 0777);
      shm_put_var($identifier, $key, 'shave and a hair cut');
      
      $firstVar = shm_get_var($identifier, $key);
      $firstVar .= 'Test String of Doom';
      $secondVar = shm_get_var($identifier, $key);
      
      if ($firstVar == $secondVar) {
          echo 'shm_get_var passes by reference';
      } else {
          echo 'shm_get_var passes by value';
      }
      

      【讨论】:

      • 古玩...结果如何?
      • 所以,在我修复了密钥需要是 Long 的事实(编辑答案以使用 long 值)之后,它打印了“shm_get_var 按值传递”。
      【解决方案3】:

      形成文档的措辞

      shm_get_var() 返回变量 使用给定的 variable_key ,在 给定共享内存段。这 变量仍然存在于 共享内存。

      我会说是的,它是对共享内存空间的引用。

      【讨论】:

      • 我的措辞听起来模棱两可。
      【解决方案4】:

      你可以使用 shm_remove() 看看这个:http://php.net/manual/en/function.shm-remove.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        相关资源
        最近更新 更多