分类目录归档:PHP

编译php7.1 openssl3.x版本过高?

下载:

wget https://openssl.org/source/openssl-1.1.1u.tar.gz tar -xzvf openssl-1.1.1u.tar.gz cd openssl-1.1.1u

编译安装:

./config --prefix=/usr/local/openssl1.1 --openssldir=/usr/local/openssl1.1/ssl
make -j$(nproc)
make install

临时改环境变量:

export PATH=/usr/local/openssl1.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/openssl1.1/lib:$LD_LIBRARY_PATH

configure php:

./configure --with-mysqli --with-pdo-mysql --enable-mbstring --enable-fpm --with-gd=/usr --with-curl --with-mcrypt --with-openssl --with-freetype-dir --with-zlib --with-jpeg-dir --with-png-dir --with-xpm-dir --enable-pcntl --with-gmp --enable-zip --enable-bcmath --with-openssl=/usr/local/openssl1.1/ --with-openssl-dir=/usr/local/openssl1.1/

编译安装:(略)

php switch 不加 break 会怎么样?

在PHP中,switch语句如果不加break会导致”case穿透”现象。具体表现如下:

当匹配到某个case后,如果没有break语句,代码会继续执行后续所有case中的语句,直到遇到break或switch结束

这种特性有时会被故意利用来实现多个case共享同一段代码的逻辑

示例说明:

switch ($value) {
  case 1:
    echo "这是1";
    // 这里没有break
  case 2:
    echo "这是2";
    break;
  case 3:
    echo "这是3";
    break;
}

当$value=1时,输出会是:
“这是1这是2”

因为匹配到case 1后,没有break阻止,所以继续执行了case 2的代码。

建议:除非有特殊需求,否则每个case后都应该加上break语句以避免意外行为。

PHP安全的获取ip

    public static function getIpX(): ?string {
        [$ip] = self::getIp();
        return $ip;
    }

    public static function getIp(): array {
        $ip0 = $ip = $_SERVER['REMOTE_ADDR'] ?? null;
        if (in_array($ip, [
            '10.29.185.7', '127.0.0.1', '172.17.0.1', '172.31.242.237', # 可信IP列表
        ])) {
            $ip1 = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? null;
            if ($ip1) {
                $ip0 = $ip1;
                $ip = explode(',', $ip1)[0];
            }
        }
        if (!$ip) {
            $ip = $_SERVER['REMOTE_ADDR'] ?? null;
        }
        return [$ip, $ip0];
    }

PHP简易排队限流实现

$fp = fopen(sprintf("tmp/wk_exam_examination.%d.lock", $userid % 10), "w");
if (!flock($fp, LOCK_EX | LOCK_NB)) {
    ?>
  <style>
    #info {
      text-align: center;
      margin: 50px 0;
    }

    #info td {
      font-size: 36px;
      color: seagreen;
    }
  </style>
  <div id='info'></div>
  <script>
    let sec = 5000
    setTimeout(function () {
      window.location.reload()
    }, sec)
    setInterval(function () {
      sec -= 100
      if (sec >= 0) {
        let ok = sec / 1000
        document.getElementById('info').innerHTML = `<table style="margin: 0 auto;">
        <tr><td style='width: 50%; text-align: right;'>页面排队中...</td>
        <td style="width: 2em; text-align: center;">${ok}</td><td>秒后将重试!</td></tr></table>`;
      }
    }, 100)
  </script><?php
    die;
}