Write the Code. Change the World.

分类目录
8月 26

oss 上传 api 中,一个是上传 file ,有个是上传 content 。如何处理各种文件以及数据格式呢。常见的一种操作是上传图片。这里就弄弄看。

操作一波

如果上传的图片是 base64 ,先要转换。我们这里定义一个函数。

function base64ToImage($file)
{
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $file, $result)) {
        $image = base64_decode(str_replace($result[1], '', $file));
        return $image;
    }
    return null;
}

我们还知道怎么拼接完成的 url。

# 这样就可以获取公网 url,当然你也可以获取内网 url
$url = App\Services\Oss::getPublicObjectURL($ossKey);

在这里,我们是先将文件传到服务器,再从服务器将文件传到 oss 上。这时,就用内网上传即可。流量要钱的,这样蛮好的。为什么不直接传 oss 上呢。直接传服务端逻辑不方便操作,直接传权限控制不好处理。反正就这种操作吧。

上边的还没说完,转换后,需要内网上传。

$file = base64ToImage($request->file);
$ossKey = ''upload/images/meets/1.jpg;
if($file) {
    $uploaded  = Oss::privateUploadContent($ossKey, $file);
}

想要删也可以的

Oss::privateDeleteObject($ossKey);

图片处理

https://help.aliyun.com/document_detail/47735.html

https://help.aliyun.com/product/31815.html

8月 26

package and github

https://packagist.org/packages/johnlui/aliyun-oss

https://github.com/johnlui/AliyunOSS

适应 laravel7 版本的请看
https://github.com/johnlui/AliyunOSS-Laravel7

操作一波

composer require johnlui/aliyun-oss

新建配置文件 config/alioss.php,填充下边的 code 。

<?php
return [
    'AccessKeyId' => env('ALIOSS_KEYID', null),                     // key
    'AccessKeySecret' => env('ALIOSS_KEYSECRET', null),             // secret
    'BucketName' => env('ALIOSS_BUCKETNAME', null)                  // bucket
];

并且在 .env.example 中加入下边的配置(养成好的习惯)。

# OSS 配置
ALIOSS_KEYID=
ALIOSS_KEYSECRET=
ALIOSS_BUCKETNAME=

继续阅读

8月 26

阿里的 rds 外网怎么连呢。需要一台能连接外网的 ecs 就可以。

操作一波

打开 navicat,新建一个连接。切换到 ssh 页签,输入 ssh 服务器的地址,账号和密码。如下图所示:

然后切换到 General(常规) 页签,填入 rds 的地址、用户名、密码,点击 test connection 即可。如下图所示:

好吧,就这样了。

8月 25

基于定位获取周边的数据的场景还是蛮多的。这不就用到了,就记录下怎么整吧。

准备

因为用到的是 laravel 框架, ORM 这些会使用到。会用到 scope。假如这里有一个模型 Meet,对用的表名是 meets, 表里有这些字段:title、content、region_code、latitude、longitude、address、created_at、updated_at

模型如下:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;

class Idc extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'content', 'region_code', 'latitude', 'longitude', 'address'];
}

开始

我们准备一个 distanc 的 scope

use Illuminate\Support\Facades\DB;

……

public function scopeDistance($query, $lat, $long, $distance)
{
    return $query->having('distance', '<', $distance)
    ->select(
        DB::raw("*,
        (3959 * ACOS(COS(RADIANS($lat))
        * COS(RADIANS(latitude))
        * COS(RADIANS($long) - RADIANS(longitude))
        + SIN(RADIANS($lat))
        * SIN(RADIANS(latitude)))) AS distance")
        )->orderBy('distance', 'asc');
}

3959 计算出来的是英里,换成 6378.138 计算出来的是公里。也就是地球的半径。

然后使用

$latitude = 31.0811;
$longitude = 121.26035;
$meets = Meet::distance($latitude,$longitude, 5)->get(['id','title', 'content', 'latitude', 'longitude', 'address']);

这样就计算出距离该坐标 5 km 内的数据了。

参考来源

https://www.it1352.com/1542694.html

https://www.box3.cn/tools/lbs.html

8月 18

params 的字符串和 array 的转换

$array = ['gender' => 1, 'target' => 2, 'region' => 310100];

$paramsStr = $str = http_build_query($array);

var_dump($paramsStr);

parse_str($paramsStr, $paramsArr);

var_dump($paramsArr);

在线测试:https://www.json.cn/runcode/run_php/

输出结果

string(31) "gender=1&target=2®ion=310100"
array(3) {
  ["gender"]=>
  string(1) "1"
  ["target"]=>
  string(1) "2"
  ["region"]=>
  string(6) "310100"
}
8月 09

一个项目,一般不仅有 mysql 数据库,还会有 redis、mongodb 等数据库。那 下边记录下 laravel 中配置和使用 mongodb。

准备

安装 mongdb 和 mongdb 扩展

# 最快最简单的安装方式
pecl install mongodb

# 在 php.ini 中配置 mongodb

# 先找到 php.ini 的位置
php -i | grep php.ini

# 开始配置
vim php.ini
# 加入 extension=mongodb.so

# 重启
/etc/init.d/php-fpm restart

# 看看扩展
php -m |grep mongodb

项目中

https://github.com/jenssegers/laravel-mongodb

composer require jenssegers/mongodb

在 config/database.php 的 connections 中配置

        'mongodb' => [
            'driver' => 'mongodb',
            'host' => env('MONGO_DB_HOST', '127.0.0.1'),
            'port' => env('MONGO_DB_PORT', 27017),
            'database' => env('MONGO_DB_DATABASE', 'homestead'),
            'username' => env('MONGO_DB_USERNAME', 'homestead'),
            'password' => env('MONGO_DB_PASSWORD', 'secret'),
            'options' => [
                'database' => env('MONGO_DB_AUTHENTICATION_DATABASE', 'admin'), // required with Mongo 3+
            ],
        ]

        # 或
        'mongodb' => [
            'driver' => 'mongodb',
            'dsn' => env('MONGO_DB_DSN'),
            'database' => env('MONGO_DB_DATABASE', 'homestead'),
        ],

在 .env 中进行 MONGO_DB_DSN 和 MONGO_DB_DATABASE 配置。

使用

这里,我既使用 mysql, 也使用 mongodb。并且都使用 ORM。 mysql 是默认驱动方式。

php artisan make:model Moment

### 编辑 App\Models\Moment ,如下
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Jenssegers\Mongodb\Eloquent\Model;

class Moment extends Model
{
    use HasFactory;

    // 驱动
    protected $connection = 'mongodb';

   // 表
    protected $collection = 'detail.idc';
}

用 tinker 试试:

php artisan tinker;

use App\Models\Moment;
Moment::first();

参考

https://www.bubaijun.com/page.php?id=230

7月 19

As you may know, this year we updated the Laravel release cycle to include one major release per year. Previously, we released two major versions per year.

These release changes would typically indicate that a Laravel 9 release is due in September of this year. However, as you may know, Laravel uses a variety of community-driven packages as well as nine Symfony components for a number of features within the framework. Symfony 6.0 is due for release in November. For that reason, we are choosing to delay the Laravel 9.0 release until January 2022.

By delaying the release, we can upgrade our underlying Symfony components to Symfony 6.0 without being forced to wait until September 2022 to perform this upgrade. In addition, this better positions us for future releases as our yearly releases will always take place two months after Symfony’s releases. This means that the upcoming Laravel release schedule will look as follows:

Laravel 9.0: January 2022
Laravel 10.0: January 2023
Laravel 11.0: January 2024
We are continuing to deliver exciting new improvements to the Laravel 8.x release series. In fact, we have been able to ship a variety of amazing new features without needing a major release, including parallel testing, model broadcasting improvements, and more. We look forward to shipping even more wonderful improvements to you soon!

原文

https://blog.laravel.com/laravel-9-release-date

7月 16

步骤

  1. 新建空目录。 zz.com
  2. 进 zz.com。 新建 composer.json 文件。并填充内容。
{
  "require": {
    "jonnyw/php-phantomjs": "4.*"
  }
}
  1. 执行 composer.update 。
  2. 建立 git 和 .gitignore 忽略文件
git init
.gitignore 中填充 /vendor
git add .
git commit -m '新建 composer.json 文件,配置安装 jonnyw/php-phantomjs'
  1. 新建路由以及配置自动加载。

参考

https://learnku.com/laravel/t/3590/php-crawls-the-page-that-needs-to-run-js-run-js-grabing-web-page-with-php-while

https://blog.junphp.com/details/391.jsp

https://blog.csdn.net/luyaran/article/details/53836486

7月 09

准备

https://github.com/FriendsOfPHP/Goutte

https://github.com/guzzle/guzzle

https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html

安装

composer require fabpot/goutte

composer require guzzlehttp/guzzle

试试

先看看 goutte

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.yuepaibao.com/moments');
$crawler->filter('.content span')->each(function ($node) {
print $node->text()."\n";
});

**再看看 GuzzleHttp **

use GuzzleHttp\Client as GoutteClient;
use GuzzleHttp\Psr7\Request as GuzzleRequest;

$url = 'https://www.hao123.com';
$request = new GuzzleRequest('GET', $url);
$client = new GoutteClient();
$response = $client->send($request, ['timeout' => 5]);
$content = $response->getBody()->getContents();
echo $content;

特殊

https://learnku.com/laravel/t/3590/php-crawls-the-page-that-needs-to-run-js-run-js-grabing-web-page-with-php-while

6月 03

mysql 事务里,没有使用 commit。导致该资源被长期占用,其他事务在抢占该资源时,因上一个事务的锁而导致抢占失败。

处理

方法一
– 查看事物表,找出被锁线程的id:SELECT * FROM information_schema.INNODB_TRX;
– 根据 id(trx_mysql_thread_id),kill掉被锁住的线程:kill 121212

方法二
– 执行MySQL命令:SHOW FULL PROCESSLIST; 找到被锁住的线程ID
– 根据id,kill掉被锁住的线程:kill 4