今天我只是想知道 PHP 如何同时处理请求。由于 PHP 可以同时处理多个请求,我想到了 PHP 脚本中可能存在的安全漏洞或错误,我只是想知道我是否有点太害怕了。
因此,如果同时有 100 个请求,并且 apache 配置为将它们转发到 PHP。PHP 将如何处理以下示例(我已经在某些现实世界的应用程序中以某种方式看到的所有示例)
所有示例彼此相似。(我不要求更好的方法来解决这些示例案例)
示例 1:创建缓存
<?php
if (!file_exists('my_cache.txt')) {
// do something slow (taking a second or so)
file_put_contents('my_cache.txt', $cache);
}
假设我们有大约 100 个请求。缓存是不是生成了100次,在缓存文件中存储了100次?
示例 2:将条目写入缓存
<?php
writeItemToDatabase($myItem);
if (countAllItemsInDatabase() > 100) {
$items = readAllItemsFromDatabase();
deleteAllItemsFromDatabase();
// Process items
}
由于“deleteAllItemsFromDatabase”函数,这个例子有点愚蠢。如果此脚本将并行执行,则可能会发生以下情况:
- 两个用户同时处理所有项目
- 有些项目永远不会被处理,因为它们在任何时候被处理之前就被删除了。
示例 3:虚拟货币
<?php
if ($user->getMoney() > 100) {
$user->decreaseMoney(100);
$user->addItem($itemToBuy);
}
如果脚本可能同时运行,则此示例存在很大的安全问题。如果我快速点击此应用程序的“购买”按钮,即使我的用户帐户上没有钱,我也可以购买物品。
问题
我想知道我是否只是有点偏执于编写脚本以防止此类问题,或者这些示例是真正的问题吗?
并且 - 对于极少数情况 - 如果我需要编写一些动作处理序列(如在那些示例中),是否有 PHP 函数/扩展来确保一次只处理一次脚本部分,例如:
<?php
$semaphore->lock();
// Do something dangerous
$semaphore->unlock();