PHP 中的共享内存文件

2024-01-01

I use openssl_pkcs7_sign and openssl_pkcs7_encrypt创建加密数据。这些函数仅接受文件名。我想将临时文件存储在共享内存中以提高性能。我明白在 Linux 中我可以file_put_contents('/dev/shm/xxx', data),但对于 Windows 来说这是不可能的。 PHP 中有可移植的方法来做到这一点吗?会shmop_功能帮助在这里?谢谢。

PS:或者有没有办法让这些函数接受数据字符串?

PS2:请勿建议调用/usr/bin/openssl来自 PHP。它不便于携带。


好的,所以我建议这样做的方法是使用文件流包装器 https://www.php.net/manual/en/class.streamwrapper.php。让我举一个简单的例子:

class staticStreamWrapper {
    public $context;
    protected static $data = array();

    protected $path    = '';
    protected $pointer = 0;
    protected $writable = false;

    public function stream_close() {}

    public function stream_eof() {
        return $this->pointer >= strlen(static::$data[$this->path]);
    }

    public function stream_flush() {}

    public function stream_open($path, $mode, $options, &$opened_path) {
        switch ($mode[0]) {
            case 'r':
                if (!isset(static::$data[$path])) return false;
                $this->path = $path;
                $this->writable = isset($mode[1]) && $mode[1] == '+';
                break;
            case 'w':
                static::$data[$path] = '';
                $this->path = $path;
                $this->writable = true;
                break;
            case 'a':
                if (!isset(static::$data[$path])) static::$data[$path] = '';
                $this->path = $path;
                $this->writable = true;
                $this->pointer = strlen(static::$data[$path]);
                break;
            case 'x':
                if (isset(static::$data[$path])) return false;
                $this->path = $path;
                $this->writable = true;
                break;
            case 'c':
                if (!isset(static::$data[$path])) static::$data[$path] = '';
                $this->path = $path;
                $this->writable = true;
                break;
            default:
                return false;
        }
        $opened_path = $this->path;
        return true;
    }
   
    public function stream_read($count) {
        $bytes = min(strlen(static::$data[$this->path]) - $this->pointer, $count);
        $data = substr(static::$data[$this->path], $this->pointer, $bytes);
        $this->pointer += $bytes;
        return $data;
    }

    public function stream_seek($offset, $whence = SEEK_SET) {
        $len = strlen(static::$data[$this->path]);
        switch ($whence) {
            case SEEK_SET:
                if ($offset <= $len) {
                    $this->pointer = $offset;
                    return true;
                }
                break;
            case SEEK_CUR:
                if ($this->pointer + $offset <= $len) {
                    $this->pointer += $offset;
                    return true;
                }
                break;
            case SEEK_END:
                if ($len + $offset <= $len) {
                    $this->pointer = $len + $offset;
                    return true;
                }
                break;
        }
        return false;
    }

    public function stream_stat() {
        $size = strlen(static::$data[$this->path]);
        $time = time();
        return array(
            0 => 0,
            'dev' => 0,
            1 => 0,
            'ino' => 0,
            2 => 0777,
            'mode' => 0777,
            3 => 1,
            'nlink' => 1,
            4 => 0,
            'uid' => 0,
            5 => 0,
            'gid' => 0,
            6 => '',
            'rdev' => '',
            7 => $size,
            'size' => $size,
            8 => $time,
            'atime' => $time,
            9 => $time,
            'mtime' => $time,
            10 => $time,
            'ctime' => $time,
            11 => -1,
            'blksize' => -1,
            12 => -1,
            'blocks' => -1,
        );
    }

    public function stream_tell() {
        return $this->pointer;
    }

    public function stream_write($data) {
        if (!$this->writable) return 0;
        $size = strlen($data);
        $len = strlen(static::$data[$this->path]);
        if ($this->stream_eof()) {
            static::$data[$this->path] .= $data;
        } else {
            static::$data[$this->path] = substr_replace(
                static::$data[$this->path],
                $data,
                $this->pointer
            );
        }
        $this->pointer += $size;
        return $size;
    }

    public function unlink($path) {
        if (isset(static::$data[$path])) {
            unset(static::$data[$path]);
        }
        return true;
    }

}

现在,您需要注册包装器:

stream_wrapper_register('static', 'staticStreamWrapper');

因此,您现在可以将其视为文件,即使它从未真正离开 PHP(它存储为静态变量)!

file_put_contents('static://foo.txt', 'this is my data');
file_get_contents('static://foo.txt'); // "this is my data"
$f = fopen('static://foo.txt', 'r'); // should return a resource
// etc...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 中的共享内存文件 的相关文章

  • 当系统上没有留下任何可执行文件时,如何卸载 Windows 服务?

    当系统上没有留下任何可执行文件时 如何卸载 Windows 服务 我跑不了installutil u因为系统上没有留下可执行文件 我仍然可以在服务控制台中看到该服务的条目 出现这种状态的原因可能是因为 msi 包中存在问题 没有正确删除服务
  • 将 PHP 中的 openssl AES 转换为 Python AES

    我有一个 php 文件 如下所示 encryption encoded key c7e1wJFz PBwQix80D1MbIwwOmOceZOzFGoidzDkF5g function my encrypt data key encrypt
  • 如何使用 php DOM 获取 内的值?

    我如何使用 php DOM 获取 内的值 这是我的 xml 中的一些代码
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 查明具有特定 ID 的会话是否已过期

    我正在创建一个上传功能 将用户上传的文件存储在服务器上 并以用户的会话 ID 作为名称 现在 我只想将此文件保留在服务器上 直到该会话处于活动状态 所以 我的问题是 如何根据会话 ID 确定会话是活动的还是过期的 以便在后一种情况下我可以安
  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • CryptoJS 使用密码加密 AES,但 PHP 解密需要密钥

    我在用CryptoJS https code google com p crypto js AES加密字符串 function doHash msg msg String msg var passphrase aggourakia var
  • 如何在 Windows 中创建上下文菜单子菜单?

    我一直在编写实用程序并通过 Shell 键 上的 Regedit 将它们映射到上下文菜单 但我不知道如何像一些更流行的实用程序那样创建子菜单 例如 如果我有三个脚本将文件移动和重命名到三个不同的文件夹 那么现在我有三个不同的上下文菜单条目
  • localhost/live - 通过 HTTP_HOST 检测

    假设我在本地开发并在实时服务器上调试小东西 在我的代码中添加这样的内容是个好主意吗 is local strpos SERVER HTTP HOST localhost false define DEBUG is local 然后在设置内容
  • 为什么 asort 适用于多维数组?

    抱歉 如果这是一个非常基本的问题 我无意中发现asort http php net manual en function asort php似乎适用于多维数组 示例 PHP animals array 1 gt array name gt
  • 细胞的 fpdf 对齐

    我正在尝试使用生成 PDFfpdf我有一个小问题 我需要有 2 个单元格 如下所示 Address Line 1 Version Address Line 2 1 0 City 06 05 2011 我尝试过使用MultiCell 但没有运
  • Lumen:无法打开流:.../vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107 中的权限被拒绝

    My OS is ubuntu 16 04 and I am running Lumen 5 5 When I try to run the app in the browser I get an error 500 我在 var log
  • 从检查元素隐藏 ''

    我有这个 HTML 和 PHP 联系表
  • 将客户分配到 magento 的多个客户组

    您好 我想将多个组分配给特定客户 例如 Rajat 客户 属于 批发 零售商 电力 实际上我在上面看到了同样的话题每个客户有多个客户组 https stackoverflow com questions 6153011 multiple c
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 创建单个随机 Magento 优惠券

    我遇到了一些麻烦 我想要做的是每次有人订阅我们的时事通讯时 在 Magento 中自动生成一个随机优惠券代码 这张优惠券可减 10 美元 并且有exp 订阅后两周的日期 因此 我正在尝试编写一个简单的脚本 当提交 订阅我们的时事通讯 表单时
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • PHP date() 和 strtotime() 返回错误的月份 31 日

    我在用着date and strtotime 函数在下拉列表中显示接下来的 3 个月 PHP代码 echo date m Y strtotime 0 months echo date m Y strtotime 1 months echo
  • Google Drive 服务帐户上传的位置

    我正在尝试使用服务帐户将文件上传到我的 Google 云端硬盘 当我部署此代码时 我不希望用户给予授权 我希望他们上传到我的帐户 我通过 PHP 使用它 下面是我到目前为止的情况 这段代码是基于官方文档给出的例子 当我运行 php 脚本时
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p

随机推荐

  • 可能是C# 4.0编译器错误,其他人可以验证吗?

    由于我不知道究竟是哪一部分触发了错误 所以我不完全确定如何更好地标记它 这个问题是SO问题的副产品C 代码似乎以无效的方式进行优化 导致对象值变为 null https stackoverflow com questions 3379894
  • 是否有解决方法可以在 Ruby 中打开包含下划线的 URL?

    我正在使用 open uri 来打开 URL resp open http sub domain domain com 如果它包含下划线 我会收到错误 URI InvalidURIError the scheme http does not
  • 如何在 C++/CLI 接口中声明默认索引属性

    如何在 C CLI 接口中声明默认索引属性 请原谅使用命名空间的重复 完全限定符号 因为我刚刚学习 C CLI 并且希望确保 C 和 C 之间不会发生语言原语的意外混淆 Code is public interface class ITes
  • 代码段的动态重定位

    只是出于好奇 我想知道是否可以在期间重新定位一段代码 程序的执行 例如 我有一个函数 这个函数应该 每次执行后都会在内存中进行替换 我们想到了一个想法 就是使用自修改代码来做到这一点 根据网上的一些资源 自行修改 代码可以在Linux上执行
  • DICOM StudyInstanceUID 对于患者来说应该是唯一的吗?

    在处理 DICOM 研究 系列和媒体概念时 我想知道这些值对于所有数据是否都是唯一的 或者仅对于它们所属的患者而言是唯一的 另有表述 我可以让 2 名患者的研究 系列 SOP 实例 uid 值相同吗 或者 DICOM 标准根本不关心这一点
  • python opencv如何分割血管

    我正在尝试使用 Python 和 OpenCV 分割视网膜图像中的血管 这是原始图像 理想情况下 我希望所有血管都像这样非常明显 不同的图像 这是我到目前为止所尝试过的 我拍摄了图像的绿色通道 img cv2 imread images H
  • 由初始值设定项列表初始化的数组存储在哪里?

    鉴于这段代码 void someFunction void int array 1 2 3 4 5 6 7 8 9 10 数组的值存储在哪里 Stack Heap 与那些字符串文字一起 是不是叫高频堆 别的地方 我问这个问题是因为我不确定这
  • 如何修改一个活动的另一活动的变量?

    比方说 头等舱 有一个变量 字符串当前值 红色 带有一个通往 Second class 一项活动 的按钮 First class Activity 在文本视图中显示变量 currentValue 的值 目前为红色 如果我们按下按钮 它将带我
  • 在 Excel 中调整单元格宽度

    我正在使用 xlsxwriter 写入 Excel 工作表 我面临的问题是 当文本大于单元格大小时 它就会被隐藏 import xlsxwriter workbook xlsxwriter Workbook file xlsx worksh
  • Crashlytics - Firebase 日志中的 Stacktrace 不可读

    我刚刚开始使用 React Native Firebase 和 Crashlytics 版本 6 当我打电话时firebase crashlytics recordError error 在JS中catch我在 Firebase Crash
  • Python 3.10 模式匹配 (PEP 634) - 字符串中的通配符

    我有一个很大的 JSON 对象列表 我想根据其中一个键的开头来解析这些对象 并使用通配符来处理其余的 很多键都是相似的 比如 matchme foo and matchme bar 有一个内置通配符 但它仅用于整个值 有点像else 我可能
  • 在struts2中使用tile

    我正在关注 Struts2 中的 Tile 教程 但遇到以下错误 SEVERE Error configuring application listener of class org apache struts2 tiles StrutsT
  • 自定义声音推送通知不起作用(Flutter)

    to XXXX notification title ASAP Alert body Please open your app data screen Nexpage1 sound alarm click action FLUTTER NO
  • 从文本文件中提取两个分隔符之间的文本

    我目前正在写关于首席执行官自恋的硕士论文 为了衡量它 我必须进行财报电话文本分析 我按照 python 中提供的答案编写了一段代码这个链接 https stackoverflow com questions 36559356 extract
  • Ruby on Rails:为什么我在 Rails 后收到有关 javascript 和 css 的消息?

    轨道 gt Started GET assets application css body 1 for 127 0 0 1 at 2011 10 11 03 37 03 0900 Served asset application css 3
  • JPA:如何覆盖@Embedded属性的列名

    Person class Embeddable public class Person Column public int code 嵌入在里面Event两个不同属性的两倍 manager and operator Entity publi
  • ICMP 是传输层协议吗?

    我正在观看有关网络的视频讲座 讲师提到 ICMP 作为传输层协议 然而 谷歌搜索它显示了各种论坛将其描述为网络层协议 这让我很困惑 有人可以澄清一下吗 传输层协议涉及端到端发送数据并确保 或明确不确保 可靠性 TCP 用于将数据从一台计算机
  • 需要对我的 SSE/Assembly 尝试提出一些建设性的批评

    我正在努力将一些代码转换为 SSE 虽然我有正确的输出 但它比标准 C 代码慢 我需要执行此操作的代码是 float ox p2x px c py s m float oy p2y px s py c m 我得到的 SSE 代码是 void
  • 更改 Excel ActiveX 列表框的名称

    我有一组 ActiveX 控件和子控件 它们像这样组合在一起 用户在 ActiveX 文本框中键入内容 TextBox Click 触发 3 个子程序的执行 第一个子更新工作表上命名范围的值 根据更新后的值 使用偏移函数在 Excel 中创
  • PHP 中的共享内存文件

    I use openssl pkcs7 sign and openssl pkcs7 encrypt创建加密数据 这些函数仅接受文件名 我想将临时文件存储在共享内存中以提高性能 我明白在 Linux 中我可以file put content