返回

PHP 跨脚本调用粘贴变量:如何让它们永不消逝?

php

PHP 中跨脚本调用保持变量:粘贴的艺术

问题陈述

在 PHP 中,如何确保一个变量在多个脚本调用中保持不变?具体来说,我需要计算 hash_hmac('sha-256', $data, $key),其中 $data 在每次调用脚本时都不同,但 $key 需要在特定服务器(Apache2)实例上的所有调用中保持不变。换句话说,我需要一个伪随机生成的 $key,仅在服务器启动或首次需要时初始化,并在服务器运行时在内存中保持,但在服务器关闭后不可恢复。

解决方案:粘贴变量

在 PHP 中,没有内置的方法来粘贴变量。然而,我们可以使用一些技巧来实现所需的行为。一种方法是使用一个全局变量:

global $key;
if (!isset($key)) {
    // 生成一个伪随机密钥并将其存储在 $key 中
    $key = hash('sha256', uniqid());
}

这种方法将在脚本的第一次调用中初始化 $key,并在随后的调用中重复使用它。但是,请注意,此方法仅在脚本在同一进程中运行时有效。

会话和 Cookie

另一种方法是使用会话或 cookie 来存储 $key。会话将在服务器上存储一个包含 $key 的文件,而 cookie 将在客户端存储一个包含 $key 的文件。这种方法允许在不同的脚本调用和不同的进程之间保持 $key

数据库

如果上述方法不适合,可以使用数据库(如 SQLite)来存储 $key。这样,$key 将存储在数据库中,并且可以在不同的脚本调用和不同的进程之间访问。

其他注意事项

  • 安全: 确保 $key 是安全的,并不会泄露给未经授权的用户。
  • 性能: 粘贴变量会增加脚本的执行时间。尽量避免在关键路径代码中使用粘贴变量。
  • 可扩展性: 如果应用程序正在扩展到多个服务器,则需要确保 $key 在所有服务器上保持一致。

结论

保持变量在多个脚本调用中粘贴的技巧对于许多应用程序至关重要。通过使用全局变量、会话、cookie 或数据库,您可以轻松实现所需的行为。选择哪种方法取决于应用程序的特定要求。

常见问题解答

Q1:为什么要保持变量粘贴?
A1:在计算签名、哈希或加密值时需要保持变量粘贴。

Q2:粘贴变量是否安全?
A2:只要正确实现,粘贴变量是安全的。确保 $key 是安全的,并且不会泄露给未经授权的用户。

Q3:如何避免粘贴变量带来的性能问题?
A3:尽量避免在关键路径代码中使用粘贴变量。考虑使用缓存或其他优化技术来提高性能。

Q4:如何确保 $key 在多个服务器上保持一致?
A4:如果应用程序正在扩展到多个服务器,则需要实现一个机制来在所有服务器上同步 $key。这可以通过使用共享数据库或分布式缓存来实现。

Q5:除了这里讨论的方法之外,还有其他粘贴变量的方法吗?
A5:还有其他粘贴变量的方法,例如使用 APC 或 Redis 等缓存机制。选择哪种方法取决于应用程序的特定要求。