分类 PHP 下的文章

PHP 计算今天是本学期的第几周

代码如下

2019-03-11 12:40 更新代码,由于上次仓促,未考虑周全,今天抽空更新一下

/**
 * 计算当前是本学期的第几周
 * 默认是以 2019-02-25 为开学时间
 * @param int $start_timestamp  本学期开始时间戳,可以用 strtotime 函数获取,如 strtotime('2019-02-25')
 * @return int
 */
function now_week($start_timestamp=1551024000)
{
    date_default_timezone_set('Asia/Shanghai');
    $this_week_monday = strtotime("monday", $start_timestamp);//获取指定时间中,周一时间戳

    //由于 strtotime("monday", $start_timestamp)  获取的周一时间戳是 周一 08:00:00
    //所以需要减去 28800秒 即得到周一 00:00:00 时间戳
    $this_week_monday = $this_week_monday-28800;

    //使用 ceil 函数进行“向下取整”
    // ceil(3.4)    输出结果为 4
    // ceil(3.6)    输出结果为 4
    return ceil((time()-$this_week_monday)/604800);
}

实际应用:

Snipaste_2019-03-11_12-45-55.png

PHP 判断 Email 在 Gravatar 有没有自定义头像

<?php
function check_have_avatar($email){
    $md5 = md5(strtolower(trim($email)));
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.gravatar.com/avatar/{$md5}");
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);

    if(md5($result) === 'd5fe5cbcc31cff5f8ac010db72eb000c'){
        return false;
    }

    return $result;
}

if(!check_have_avatar('ne@nowtime.cc')){
    echo '没有自定义头像';
}else{
    echo '有自定义头像';
}

ThinkPHP 5.1 使用 Md\MDAvatars 输出无法显示图片 的 解决办法

代码如下:

<?php
/**
 * Created by PhpStorm.
 * Date: 2019/1/20
 * Time: 9:53
 */

namespace app\api\controller;

use Md\MDAvatars;

class Avatars
{
    public function index()
    {
        $Avatar = new MDAvatars('X', 512);
        $Avatar->Output2Browser();
    }
}

输出结果

Snipaste_2019-01-20_10-08-47.png

解决办法

$Avatar->Output2Browser(); 上一行加一句 ob_end_clean(); 即可解决

<?php
/**
 * Created by PhpStorm.
 * Date: 2019/1/20
 * Time: 9:53
 */

namespace app\api\controller;

use Md\MDAvatars;

class Avatars
{
    public function index()
    {
        $Avatar = new MDAvatars('X', 512);
        ob_end_clean();
        $Avatar->Output2Browser();
    }
}

Snipaste_2019-01-20_10-12-15.png

Composer 常见问题

原文链接:Composer常见问题
安装了Composer后,运行 composer --version,查看Composer的版本号。如果出现下面的提示,那么软件安装成功。

Composer version 1.2.0 2016-07-19 01:28:52

若想给某个项目添加类似monolog的第三方库,则按下面的步骤操作:

新建 composer.json 文件,添加内容:

 {
       "require": {
         "monolog/monolog": "1.20.0"
       },
       "repositories": {
         "packagist": {
           "type": "composer",
           "url": "https://packagist.phpcomposer.com"    // Mirror site in China.
         }
       }
 }

以命令行方式打开项目的根目录,输入命令:composer install

正常情况下,一切顺利,执行完上述命令就能够成功导入 monolog 库到项目中。但是,现实与想象总是有段距离,上面只是走完了“长征”路程的一半,还有“雪山”要翻、“草地”要过呢!

执行完命令:composer install 后,并不会像期待那样地导入依赖,而是抛出异常。

The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl exension, you can disable this error, at your own risk, by setting the ‘disable-tls’ option to true.

这段异常日志的大致意思是,Composer 采用 SSL 连接,需要外挂 OpenSSL 插件。

要消除这个异常,有两种解决方式,一是放弃SSL连接、直接“裸奔”;二是启用 OpenSSL。

取消SSL连接的命令是 composer config -g -- disable-tls true。然而并没有什么卵用,试过之后,又抛出了新的异常。

剩下来的方案就是尝试启用 OpenSSL。安装了PHP后,安装目录(类似C:php-5.6.24)中包含两个文件,一个是php.ini-development,另一个是php.ini-production,选择将其中任意的一个文件重命名为 php.ini,用作PHP的默认配置文件。通过修改配置文件来启用OpenSSL插件。

编辑php.ini文件,首先,定位到:

; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
extension_dir = "./"
; On windows:
extension_dir = "ext"

删除 extension_dir = "./"extension_dir = "ext" 前面的分号,取消注释这两行代码,配置 PHP 插件目录为./ext。

然后,定位到:

...
;extension=php_mysqli.dll
;extension=php_oci8_12c.dll  ; Use with Oracle Database 12c Instant Client
extension=php_openssl.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
...

删除 extension=php_openssl.dll 前面的分号,取消注释,从而启用 OpenSSL 插件。

注意:因为 SSL 连接需要认证,所以继续下面的步骤之前,需要准备好CA证书(建议把证书保存到 C:\php-5.6.24\verify 目录中),可以从 https://curl.haxx.se/docs/caextract.html 处下载。

接下来,定位到

;openssl.cafile= 

和上面一样,删去分号,取消注释,设置CA证书为 openssl.cafile= C:\php-5.6.24\verify\cacert.pem

最后, 重新在命令行窗口中打开项目的根目录,执行命令:composer install,等待几分钟后,就可以成功添加 monolog 依赖。

PHP 获取 QQ群 bkn 参数

由于项目需求,需要获得 QQ 群成员的信息,所以便使用 Google 找到了这个开源项目:

GitHub 项目地址:https://github.com/nasaplayer/getCurrentQQGroupList

由于我只需要 bkn 的计算代码,所以我就提取出来了

这个计算方法的位置在:https://github.com/nasaplayer/getCurrentQQGroupList/blob/master/v3/getCurrentQQ.class.php
第 177 行
<?php

$skey = '@ziDp00luu';//这个 skey 总知道获取吧,不再累述
echo getBkn($skey);//正常的话,输出的是:500891986

//计算 bkn
function getBkn($skey) {
    $hash = 5381;
    for ($i = 0, $len = strlen($skey); $i < $len; ++$i){
        $hash +=($hash << 5) + charCodeAt($skey, $i);

    }
    return $hash & 2147483647;
}

function charCodeAt($str, $index){
    $char = mb_substr($str, $index, 1, 'UTF-8');
    $value = null;
    if (mb_check_encoding($char, 'UTF-8')){
        $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');
        $value = hexdec(bin2hex($ret));
    }
    return $value;
}