加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP如何同时管理请求

发布时间:2020-12-13 22:48:15 所属栏目:PHP教程 来源:网络整理
导读:今天我只是想知道 PHP如何同时处理请求.由于 PHP可以同时处理多个请求,我想到了PHP脚本中可能存在的安全漏洞或错误,我只是想知道我是否有点太害怕了. 因此,在同时有100个请求并且apache被配置为将它们转发到PHP的情况下. PHP将如何处理以下示例(我已经在某些
今天我只是想知道 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();

解决方法

https://github.com/mpapec/simple-cache/blob/master/example3.php
????

require "SafeCache.class.php";


// get non blocking exclusive lock
$safe = new SafeCache("exclusive_lock_id");

if ( $safe->getExclusive() ) {
  print "we have exclusive lock now<br>";

  // ...

  print "releasing the lock<br>";
  $safe->doneExclusive();
}

另外,请查看安全缓存生成的其他示例.
https://github.com/mpapec/simple-cache/blob/master/example1.php

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读