在PHP请求之间增加变量

时间:2015-11-27 13:16:53

标签: php persistence

我正在编写一个PHP脚本,根据请求,它将使用各种参数调用SOAP服务,其中一些参数来自请求。

但是,我使用的特定SOAP服务要求每个请求都包含一个唯一的ID,在这种情况下需要为每个请求递增。它不能基于时间,并且对于每个请求必须是唯一的,但是如果跳过值则无关紧要。

使用MySQL数据库存储单个值似乎有点过分。我已经考虑过存储并将其加载到文件中,但是人们会想到竞争条件的问题。

我确实可以完全访问服务器,这将是专门用于此任务的某种Linux风格。

有没有一种简单的方法可以实现?

4 个答案:

答案 0 :(得分:-1)

在任何新请求使用PHP time()函数获取增量值之前,因为每个请求的时间都是唯一的。

 $increment_id = time();

答案 1 :(得分:-1)

如果您的应用程序是单个服务器,您可以尝试使用以下方法在APC中存储增量ID:

$key = 'soap_service_name';
if (!apc_exists($key)) {
    apc_store($key, 0);
}
$id = apc_inc($key);

您需要检查APC缓存中是否存在密钥并设置为0,否则apc_inc将失败并返回false

如果您有多服务器应用程序,则可以在Memcache / Redis中存储增量ID(需要运行其他服务):

$key = 'soap_service_name';
$memcache = memcache_connect('memcache_host', 11211);
if (!empty(memcache_exists($memcache, $key))) {
    memcache_set($memcache, 0);
}
$id = memcache_increment($memcache, $key);

与APC相同的情况如果您拨打memcache_increment,如果密钥尚未存在,它将会失败。

如果应该持久存储该增量ID,Redis将更有用,因为它具有所有数据的磁盘写入。它是一种带磁盘写的Memcache。

答案 2 :(得分:-1)

这就是我最终实现这一目标的方式。在考虑了各种选项后,数据库和各种缓存选项似乎有点矫枉过正。此外,缓存,cookie和会话似乎是相对临时的,而我真的在寻找一种非易失性的解决方案。

这就是我想出的 - 一个简单的文件锁定解决方案。我还没有意识到PHP可以处理文件锁,但是在发现这一点后,它似乎是最好的方法。

此示例在读取和更新值之前获取文件的独占锁定。如果它达到max int,则重置。然后等待5秒钟。如果脚本连续几次被调用,请观察每个请求是否等待锁定从之前的释放,然后再继续。

有什么好处,因为这是PHP,不存在的文件,无效的内容等,只会导致该值默认为零。

<?php

$f = fopen('sequence_num.txt', 'r+');

echo "Acquiring lock<br />\n";
flock($f, LOCK_EX);

echo "Lock acquired, updating value<br />\n";
$num = intval(fread($f, strlen(PHP_INT_MAX)));
echo "Old val = " . $num;
if ($num >= PHP_INT_MAX) {
    $num = 0;
} else {
    $num++;
}
echo " New val = " . $num;
echo "<br />Waiting 5 seconds<br />\n";
rewind($f);
ftruncate($f, 0);
fwrite($f, $num);
sleep(5);

echo "Releasing lock<br />\n";
flock($f, LOCK_UN);
fclose($f);

答案 3 :(得分:-1)

如果您乐意使用浮动作为唯一值,请使用:

$unique_id = microtime(true);

如果您希望简单地增加,可以使用会话var:

/**
 * Get session increment.
 *
 * @param string $id
 * @param int $default
 * @return int
 */
function get_increment($id, $default = 0)
{
    if (array_key_exists($id, $_SESSION)) $_SESSION[$id] += 1;

    else $_SESSION[$id] = $default;

    return $_SESSION[$id];
}

var_dump(get_increment('unique_id'));