Paylaşımlı bellek alırken PHP değişkenleri kopya mı?

3 Cevap php

Ben bir shm_get_var çalıştırırsanız (), paylaşılan hafızada veri tutmak, bir "başvuru" dönecek?

Ben bu 50MB dizi etrafında asılı birden fazla kopyalarını tutmak zorunda kalmadan çoklu süreçleri tarafından kullanılabilir böylece paylaşılan hafızada boyutu 50MB bir dizi tutmak isteyen kulüpler. Paylaşılan bellek cevap değilse, herkes başka bir fikir var mı?

3 Cevap

Bu PHP 5.2.9 de sysvsem.c gelen alakalı C kod parçacığını:

/* 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 tüm değer, bir 50MB dizisinde, gerçekten yavaş olacak size shm_get aramak her zaman, unserialize zorunda kalacak.

Nasıl bireysel değerleri içine kesiliyor hakkında?

Ayrıca paylaşılan hafızanın tümünü idare edecek APC değişken önbelleğini kullanarak ve sizin için kilitleme düşünebilirsiniz (ve aynı zamanda anahtar aramaları için bir karma tablo kullanacağız)

Belgelerin ifadeler oluşturmak

shm_get_var() returns the variable with a given variable_key , in the given shared memory segment. The variable is still present in the shared memory.

Ben evet paylaşımlı bellek alanı için bir referans olduğunu söyleyebilirim.

Ben bu konuda uzman değilim, ancak aşağıdaki gibi bir bu şey için hızlı bir test yazmak mümkün olurdu?

$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';
}