shm.php
来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 227 行
PHP
227 行
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP Version 4 |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license, |// | that is bundled with this package in the file LICENSE, and is |// | available at through the world-wide-web at |// | http://www.php.net/license/2_02.txt. |// | If you did not receive a copy of the PHP license and are unable to |// | obtain it through the world-wide-web, please send a note to |// | license@php.net so we can mail you a copy immediately. |// +----------------------------------------------------------------------+// | Authors: David Sklar <sklar@sklar.com> |// +----------------------------------------------------------------------+//// $Id: SHM.php,v 1.2 2003/01/15 22:00:36 sklar Exp $///** * This class implements a user-space stream that reads/writes shared * memory. It requires the shmop extension for shared memory access. * * Sample Usage: * * require_once('Stream/SHM.php'); * stream_register_wrapper('shm','Stream_SHM') or die("can't register shm"); * $shm = fopen('shm://0xabcd:12000','c'); * fwrite($shm, 'One Two Three Four'); * fseek($shm,4,SEEK_SET); * $two = fread($shm,3); // $two is "Two" * fclose($shm); * * Specify the key of the shared memory segment in decimal or hexadecimal * after the "shm://" and then optionally, a colon and the size of the * shared memory segment. If you don't specify a size, the segment size * defaults to 16384 bytes. * * Allowable modes are "a", "c", "w", and "n". For what those modes * mean, see: * --> http://www.php.net/manual/en/function.shmop-open.php * * * @author David Sklar <sklar@sklar.com> * @version 1.0 * @package Stream::SHM */class Stream_SHM { /** * position * * @var string stream position in the shared memory segment */ var $pos = 0; /** * shared memory segment key * * @var integer key (for shmop_open()) of the segment */ var $shm_key; /** * shared memory segment size * * @var integer size of the shared memory segment (default: 16k) */ var $size = 16384; /** * shared memory segment handle * @var resource handle to the segment for the shmop_*() functions */ var $shm; /** * Stream opener * * @param string $path URL-style path to the segment * @param string $mode mode to open the segment with * @param integer $options stream options * @param string &$opened_path (not used) * @return boolean Stream opened sucessfully? */ function stream_open($path, $mode, $options, &$opened_path) { $url = parse_url($path); $this->shm_key = $url['host']; if ((! intval($this->shm_key)) && (! preg_match('/^0x[0-9a-f]+$/i', $this->shm_key))) { if ($options & STREAM_REPORT_ERRORS) { trigger_error("Stream_SHM::stream_open: $this->shm_key is not a valid shm key.",E_USER_ERROR); } return false; } if (intval($url['port'])) { $this->size = intval($url['port']); } if (($mode != 'a') && ($mode != 'c') && ($mode != 'w') && ($mode != 'n')) { if ($options & STREAM_REPORT_ERRORS) { trigger_error("Stream_SHM::stream_open: $mode is not a valid mode (must be one of: a c n w)",E_USER_ERROR); } return false; } if (! ($this->shm = shmop_open($this->shm_key,$mode,0600,$this->size))) { if ($options & STREAM_REPORT_ERRORS) { trigger_error('Stream_SHM::stream_open: shmop_open() failed'); } return false; } $this->size = shmop_size($this->shm); return true; } /** * Stream closer * */ function stream_close() { shmop_close($this->shm); } /** * Read from stream * * @param integer $count How many bytes to read from the stream * @return string Data read from the stream */ function stream_read($count) { // Don't read past the end of the stream if ($count + $this->pos > $this->size) { $count = $this->size - $this->pos; } $data = shmop_read($this->shm,$this->pos,$count); $this->pos += strlen($data); return $data; } /** * Write to stream * * @param mixed $data Data to write to the stream * @return integer Bytes actually written to the stream */ function stream_write($data) { $count = shmop_write($this->shm,$data,$this->pos); $this->pos += $count; return $count; } /** * Check stream end-of-file * * @return boolean Is the stream position at the end of the stream? */ function stream_eof() { return ($this->pos == ($this->size - 1)); } /** * Get stream position * * @return integer The current position in the stream */ function stream_tell() { return $this->pos; } /** * Adjust current position in the stream * * @param integer $offset How many bytes to move the position * @param integer $whence Where to start counting from * @return boolean Was the position adjustment successful? */ function stream_seek($offset,$whence) { switch ($whence) { case SEEK_SET: if (($offset >= 0) && ($offset < $this->size)) { $this->pos = $offset; return true; } else { return false; } break; case SEEK_CUR: if (($offset >= 0) && (($this->pos + $offset) < $this->size)) { $this->pos += $offset; return true; } else { return false; } break; case SEEK_END: if (($this->size + $offset) >= 0) { $this->pos = $this->size + $offset; return true; } else { return false; } break; default: return false; } } /** * Flush data to the stream * * @return boolean Data is always flushed when writing with shmop_write() */ function stream_flush() { return true; }}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?