Хочется иногда использовать временный файлы в оперативной памяти во время работы скрипта, как бы это реализовать без монтирования доп раздела в оперативку? Что нибудь наподобие http://stackoverflow.com/questions/2987265/using-a-php-memo ... ses-errors У кого есть какие мысли?
Интересует решение задачи через php, про остальные решения я в курсе - все юзается когда уместно и возможно.
И на этом спасибо P.S. Кого интересует данный вопрос - смотрите в сторону http://www.php.ru/manual/function.stream-wrapper-register.html http://stackoverflow.com/questions/4755565/what-is-stream-w ... tcol-scope
Что дает возможность написание своего враппера файловой системы или что дают временные файлы в оперативке? На каждый из этих вариантов можно задать еще по 100500 уточняющих вопросов. Конкретезируйте вопрос пожалуйста Добавлено спустя 55 секунд: Хватит тролить, не очень получается да и смысла не вижу, этож форум о php и раздел вы выбрали неподходящий.
а вы не путаете божий дар с яичницей случайно? если у вас есть файлы в оперативке на рам-диске, зачем вам враппер, если к ним можно обращаться как к файлам =) и всё уже украдено до вас. если у вас нет файлов в оперативке, враппер-то как вам поможет? тролите пока только вы. Добавлено спустя 1 минуту 55 секунд: www.jonnyb.ru/ - не открывается
igordata, вы что то путаете. Я пишу свой враппер, при записи и чтении работает не с файловой системой а, например, с массивом - вот так мне враппер и поможет. Сайт мне уже не нужен, спасибо что обратили внимание. Добавлено спустя 2 минуты 41 секунду: Код (Text): <?php class CData { private static $_data; public static function has($key) { return isset(self::$_data[$key]); } public static function get($key) { if (self::has($key)) { return self::$_data[$key]; } return false; } public static function set($key, $value) { self::$_data[$key] = $value; return strlen(self::$_data[$key]); } public static function delete($key) { if (self::has($key)) { unset(self::$_data[$key]); return true; } return false; } } class MemoryStream { private $_position; private $_path; private function _setStreamData($data) { return CData::set(__CLASS__ . '_' . $this->_path, $data); } private function _getStreamData() { return CData::get(__CLASS__ . '_' . $this->_path); } private function _deteteStreamData() { return CData::delete(__CLASS__ . '_' . $this->_path); } public function stream_open($path, $mode, $options, &$opened_path) { $this->_path = $path; if (strpos($mode, 'w') !== false) { $this->_setStreamData(''); $this->_position = 0; } else { $this->_position = 0; } return true; } public function stream_read($count) { $string = substr($this->_getStreamData(), $this->_position, $count); $this->_position += strlen($string); return $string; } public function stream_write($data) { $this->_setStreamData( substr($this->_getStreamData(), 0, $this->_position) . $data . substr($this->_getStreamData(), $this->_position + strlen($data)) ); $this->_position += strlen($data); return strlen($data); } public function stream_tell() { return $this->_position; } public function stream_eof() { return $this->_position >= strlen($this->_getStreamData()); } public function stream_seek($offset, $whence) { switch ($whence) { case SEEK_SET: if ($offset < strlen($this->_getStreamData()) && $offset >= 0) { $this->_position = $offset; return true; } else { return false; } break; case SEEK_CUR: if ($offset >= 0) { $this->_position += $offset; return true; } else { return false; } break; case SEEK_END: if (strlen($this->_getStreamData()) + $offset >= 0) { $this->_position = strlen($this->_getStreamData()) + $offset; return true; } else { return false; } break; default: return false; } } public function stream_stat() { } public function url_stat($path) { $data = array( 'size' => strlen($this->_getStreamData()), ); return $data; } public function unlink($path) { $this->_path = $path; $this->_deteteStreamData(); } } stream_wrapper_register('memoryfile', 'MemoryStream') or die('Failed to register protocol'); file_put_contents('memoryfile://myfile1', 'test content1'); file_put_contents('memoryfile://myfile2', 'test content2'); var_dump(file_get_contents('memoryfile://myfile1')); var_dump(file_get_contents('memoryfile://myfile2')); unlink('memoryfile://myfile1'); var_dump(file_get_contents('memoryfile://myfile1')); Первый набросок, без обработки всяческих исключительных ситуаций + реализованы не все функции для работы с файловой системой. Код каждый правьте под себя, спасибо за внимание)
igordata, столько сообщений, а понять не можете зачем нужны врапперы. Можно и без хттп враппера тянуть файлы с веба например через сокеты :-D Такие вещи я включил бы например в любой фреймворк, где нужна быстрая работа со временными данными. Работа ведется с оперативкой как с файлом, а если враппер свой не сделать, то получится нужно диск каждый раз создавать в операционной системе, монтировать, и т.д. Тут написал и работаешь ничего не трогаешь, в ось ваще не лазиешь. Если надо из репа подтянул и продолжил. И под виндой например работает без доп. телодвижений.
я знаю зачем нужен враппер. Я не понимаю что делает ТС. есть рамдиски, есть мемкешед и всякое такое. А это зачем?
Вам выдумать задачу? Протягиваем куки курла между запросами через CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR, при этом мемкешед вам не поможет, рамдиск - его нет или вы провели нагрузочное тестирование, которое показало что это медленнее и неэффективнее, или что бы после того как скрипт падает с экзепшеном файл все таки удялялся из оперативы сам, или, или (100500 раз)
Рамдиск и мемкэш это технология внешняя, настраиваемая отдельно, осезависимая, а это работает сразу из коробки. И память никогда не кончится. Что не понятного? Последний абзац перечитайте мой дважды.