php shmop_open に関する質問

WBOY
リリース: 2016-06-13 13:28:01
オリジナル
1080 人が閲覧しました

php shmop_open

PHP コードの問題
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php
$arr=array();
function application($key,$value="")
{
    global $arr;
    if($value=="")
    {
        $shm_id = @shmop_open(12345, "a", 0644,100);
    }else{
        @$shm_id = shmop_open(12345, "c",0,0);
        if(!$shm_id)
        {
            $shm_id=shmop_open(12345,"c",0644,100);
        }
    }
    @$byte=shmop_read($shm_id,0,1024*1024);
    if(!$byte){
        return "";
    }else{
        if($byte!=""){
            $arr=unserialize($byte);
        }else{
            return "";
        }
    }
    if($value=="")//取值
    {
        shmop_close($shm_id);
        if(array_key_exists($key,$arr))
        {
            return $arr[$key];
        }
        return "";
    }else{
        $arr[$key]=$value;
        shmop_write($shm_id,serialize($arr),0);
        shmop_close($shm_id);
    }
}
?>

ログイン後にコピー


php の asp でアプリケーション オブジェクトの関数を実装します
現在の問題は、同じ http リクエストにあります。 application("a","1") が実行されると、application("a") は 1 を返します。上記の関数は正常です
しかし、2 番目のリクエストが開始されると、application("a") は実行できません値を取得します
何が問題ですか?


-----解決策---------
shmop_open(12345, " a", 0644,100);
は最大可能スペース (バイト数)
を表し、shmop_read($shm_id,0,1024*1024);
は読み取り時に範囲外です。いわゆるメモリオーバーフローです
------解決策---------
一般的には次のように記述できます
PHP コード
$p = 新しい共有;
//$p->a = 'abcd';
//$p->b = 1234;
print_r($p->_all);
エコー $p->b;

クラス共有 {
  プライベート $shm_id;
  プライベート $shm_key = 0xff3;
  プライベート $shm_size = 1024;
  関数 __construct() {
    $this->shm_id = shmop_open($this->shm_key, "c", 0644, $this->shm_size) または die('アプリケーションが失敗しました');
  }
  関数 __get($name) {
    $buf = shmop_read($this->shm_id, 0, $this->shm_size);
    $buf = unserialize(trim($buf));
    if($name == '_all') $buf を返します。
    isset($buf[$name]) を返します。 $buf[$name] : false;
  }
  関数 __set($name, $value) {
    $buf = shmop_read($this->shm_id, 0, $this->shm_size);
    $buf = unserialize(trim($buf));
    $buf[$name] = $value;
    $buf = シリアル化($buf);
    if(strlen($buf) >= $this->shm_size) die('スペース不足');
    shmop_write($this->shm_id, $buf, 0) または die('書き込み失敗');
  }
}
<br><font color="#e78608">------解決策------------------</font><br>前回の投稿と同様、ディスカッションは <br>Linux には php_shmop.dll 拡張子に基づく別の方法がありますが、原理は同じです<br>php_shmop は Linux でもコンパイルできますが、ウィンドウ用に設計されています<br>
<br><br>------解決策---------<font color="#e78608"></font>あなたの悩みをわかりやすくお伝えします<br><br> 共有メモリ領域はロックする必要があります。PHP はプロセスによって共有されるミューテックスを設定できません。<br><div class="clear"> を使用してロックを行うこともできます。</div>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート