문제

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의 변수 캐시 사용을 고려할 수도 있습니다.

다른 팁

문서의 문구를 형성하십시오

shm_get_var () 주어진 공유 메모리 세그먼트에서 주어진 변수 _key로 변수를 반환합니다. 변수는 여전히 공유 메모리에 존재합니다.

나는 공유 메모리 공간에 대한 참조라고 말할 것입니다.

나는 이것에 대한 전문가가 아니지만 다음과 같은 것들에 대한 빠른 테스트를 작성할 수 있습니까?

$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_remove ()를 사용할 수 있습니다. http://php.net/manual/en/function.shm-remove.php

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top