shm_get_var() を実行すると、「参照」が返され、共有メモリにデータが保持されますか?
この 50MB 配列の複数のコピーをぶらぶらさせずに複数のプロセスで使用できるように、共有メモリに約 50MB のサイズの配列を保持したいと考えています。共有メモリが答えではない場合、誰か別のアイデアがありますか?
shm_get_var() を実行すると、「参照」が返され、共有メモリにデータが保持されますか?
この 50MB 配列の複数のコピーをぶらぶらさせずに複数のプロセスで使用できるように、共有メモリに約 50MB のサイズの配列を保持したいと考えています。共有メモリが答えではない場合、誰か別のアイデアがありますか?
これは、PHP 5.2.9 の sysvsem.c からの関連する C コード スニペットです。
/* 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);
PHP は、shm_get を呼び出すたびに値全体をシリアル化解除する必要があります。これは、50MB の配列では非常に遅くなります。
それを個別の値に分解してはどうでしょうか。
また、すべての共有メモリとロックを処理する APC の変数キャッシュの使用を検討することもできます (また、キー検索にハッシュ テーブルを使用します)。
私はこれについて専門家ではありませんが、次のような簡単なテストを書くことは可能でしょうか?
$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';
}
ドキュメントの文言を形成する
shm_get_var()は、指定された共有メモリセグメント内の指定されたvariable_keyを持つ変数を返します。変数はまだ共有メモリに存在します。
はい、それは共有メモリ空間への参照だと思います。
あなたはshm_remove()を使うことができますこれをチェックしてください:http://php.net/manual/en/function.shm-remove.php