关于laravel:Laravel数据库常用方法获取结果

1.获得数据表的所有行你能够应用 DB facade 里的 table 办法来开始查问。 table 办法为给定的表返回一个查问结构器实例,容许你在查问上链式调用更多的束缚,最初应用 get 办法获取后果:namespace App\Http\Controllers;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\DB;class UserController extends Controller{ // 显示所有应用程序的用户列表。 public function index() { $users = DB::table('users')->get(); }}get() 办法返回一个蕴含 IlluminateSupportCollection 的后果,其中每个后果都是 PHP StdClass 对象的一个实例。能够用 toArray() 把对象转数组。2.从数据表中获取单行如果只须要从数据表中获取一行数据,应用 first 办法。该办法返回一个 StdClass 对象:$user = DB::table('users')->where('name', 'John')->first();dd($user->name);通过 id 字段值获取一行数据,应用 find 办法:$user = DB::table('users')->find(1);3.从数据表中获取单列如果只须要从数据表中获取一行数据,应用 first 办法。该办法返回一个 StdClass 对象:$nameItems = DB::table('users')->pluck('name');foreach ($nameItems as $name) { echo $name;}4.从数据表中获取单个值如果只须要从数据表中获取一行数据,应用 first 办法。该办法返回一个 StdClass 对象:$addr = DB::table('users')->where('name', 'John')->value('addr');

July 29, 2020 · 1 min · jiezi

关于laravel:构造一个仿Laravel-Mvc框架-模型Model

接上篇 结构一个仿Laravel Mvc框架 - 路由篇,本章接着叙述,如何构建框架中的 Model层(模型)。 上一篇中的案例都是将代码写在路由闭包中的,如果路由定义的多了,十分不好保护和治理.所以咱们首先须要实现一个 Controller 来解决咱们的业务逻辑,也就是Mvc中的C层。 建设控制器首先参考Laravel目录架构,创立好咱们的控制器文件 mkdir App/Http/Controllers/IndexControllerIndexController创立实现后,编写相干的函数来解决首页的逻辑. <?phpnamespace App\Http\Controllers;class IndexController{ public function index() { return '胜利拜访首页,这里是IndexController'; }}更改路由映射到该控制器上,批改routers.php $app['router']->get('/index', 'App\Http\Controllers\IndexController@index');最初更改composer.json,配置主动加载门路,而后再执行 composer dump-autoload { "name": "17ns/laramvc", "authors": [{ "name": "17ns", "email": "aa@bb.com" }], "require": { "illuminate/routing": "*", "illuminate/events": "*" }, "autoload": { "psr-4": { "App\\": "app/" } }}增加模型组件下面步骤实现实现后,就开始增加 illuminate/database 这个组件,来实现像Laravel一样的弱小的ORM。 执行上面的命令开始引入组件 composer require "illuminate/database":"*" 引入实现后,就开始欠缺数据库的配置,这里仍然参照laravel建设一个 config/database.php 文件,来作为数据库连贯的配置文件,建设实现后,开始填写本地货远端服务器的MYSQL配置信息。 <?phpreturn [ 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'laramvc', 'username' => 'root', 'password' => 'localdb001', 'charset' => 'utf8', 'collation' => 'utf8_general_ci', 'prefix' => '',];配置实现后,就须要在首页入口文件启动 Eloquent ORM,相干代码如下: ...

July 27, 2020 · 1 min · jiezi

关于laravel:mPDF-临时文件目录不可写

1.问题还原Temporary files directory "……/vendor/mpdf/mpdf/src/Config/../../tmp" is not writable2.解决方案本地开发windows环境并没有呈现问题,部署到Linux服务器,呈现长期文件目录...不可写。百度了很多没有找到解决方案,最初浏览官网文档,尝试在对象初始化时指定长期目录,就OK了。$mpdf = new \Mpdf\Mpdf([ 'tempDir' => __DIR__ . '/tmp']);

July 21, 2020 · 1 min · jiezi

关于laravel:构造一个仿Laravel-Mvc框架-路由篇

在咱们日常应用Laravel框架中,有很多值得咱们学习的设计理念和开发思维,如何代码变得更加“优雅”,外围架构中组件化、服务容器、数据库ORM 都是很值得咱们去探索一二的方向。 在本系列博客中,将利用 Laravel 中组件化的特点来构建一个迷你 仿 Laravel 的 MVC框架。 本篇的利用次要是讲述,如何利用 illuminate/routing 来实现框架的路由模块,通过配置的定义来实现申请的转发和跳转。 1.初始化一个新我的项目首先创立一个我的项目,名称轻易定义,我这里采纳的是 laramvc mkdir laramvc而后创立一个 composer.json 文件 填充内容如下: { "name": "你的项目名称", "authors": [{ "name": "作者名称", "email": "作者邮箱" }], "require": { }}执行 composer update 用于生成vendor目录及主动加载文件。 composer update执行实现后,咱们仿照Laravel在我的项目下,建设 app 及 public 目录,用于贮存我的项目外围业务逻辑及提供对外拜访逻辑。 mkdir app && mkdir public2.增加路由组件执行完上述步骤后,咱们开始增加路由组件 illuminate/routing,然而该组件又依赖到了另一个组件 illuminate/events 组件,所以咱们须要将这两个组件一起引入进来。 执行 composer 操作如下: composer require "illuminate/events":"*"composer require "illuminate/routing":"*"引入实现后,咱们参照laravel建设路由定义文件 app/Http/routes/routers.php <?php$app['router']->get('/', function () { echo '欢送拜访 laramvc';});定义好路由后,持续参照laravel建设内部拜访路口文件 public/index.php ...

July 20, 2020 · 1 min · jiezi

laravel-中轻松容易的输出-SQL-语句

laravel-dump-sql laravel-dump-sql - laravel 中轻松容易的输入 SQL 语句装置$ composer require guanguans/laravel-dump-sql -v公布服务$ php artisan vendor:publish --provider="Guanguans\\LaravelDumpSql\\ServiceProvider"应用装置胜利后查问构建器会新增 toRawSql、dumpSql、ddSql 三个办法// 获取 SQLUser::where('id', 1)->toRawSql();DB::table('user')->where('id', 1)->toRawSql();// 打印 SQLUser::where('id', 1)->dumpSql();DB::table('user')->where('id', 1)->dumpSql();// 打印 SQL 并退出User::where('id', 1)->ddSql();DB::table('user')->where('id', 1)->ddSql();自定义办法名称公布配置文件$ php artisan vendor:publish --tag=laravel-dump-sqlconfig/dumpsql.php 文件中配置办法名称既可<?phpreturn [ /* * Get sql statement. */ 'to_raw_sql' => 'toRawSql', /* * Print SQL statements. */ 'dump_sql' => 'dumpSql', /* * Print SQL statements and exit. */ 'dd_sql' => 'ddSql',];

July 16, 2020 · 1 min · jiezi

gitlab安装自动部署laravel项目

gitlab安装使用docker安装gitlab1:docker pull gitlab/gitlab-ce2:docker run -d -p 4438:443 -p 8088:80 -p 2228:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce3:/var/opt/gitlab/gitlab-rails/etc/gitlab.yml 在容器里修改文件 host4:gitlab-ctl restart 重启在宿主机安装gitlab-runner 用docker安装踩了很多坑,因为内网物理服务器限制无法本地访问ssh免密登录// 切换到gitlab-runnersu gitlab-runner// 生成公私钥ssh-keygen//本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id -i /home/gitlab-runner/.ssh/id_rsa.pub root@172.17.0.1 (172.17.0.1 宿主机ip,docker网络ip;ip addr)laravel项目自动构建yml文件 stages: - developdevelop: stage: develop cache: paths: - vendor/ tags: - develop script: - composer install - cp .env.example .env - php artisan key:generate - php artisan migrate - rsync -arvp -e "ssh" --rsync-path="sudo rsync" --delete-before . root@172.17.0.1:/xxx/xxxx/blog/ - ssh root@172.17.0.1 "cd /xxx/xxx/blog && php artisan config:cache && supervisorctl restart all" only: - developphp artisan config:cache // 这个命令要放到代码同步后,否则会缓存配置文件,导致路径不一致supervisorctl restart all 如果有队列任务是用supervis来管理,需要重启

July 7, 2020 · 1 min · jiezi

laravel-419-Page-Expired页面问题

在laravel项目中,表单正常操作时无异常,页面打开后长时间未操作,再次提交表单时,页面显示 “419 | Page Expired”错误。解决方式如下: <?phpnamespace App\Exceptions;use Exception;use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;use Illuminate\Session\TokenMismatchException;class Handler extends ExceptionHandler{ /** * A list of the exception types that are not reported. * * @var array */ protected $dontReport = [ // InvalidRequestException::class, ]; /** * A list of the inputs that are never flashed for validation exceptions. * * @var array */ protected $dontFlash = [ 'password', 'password_confirmation', ]; /** * Report or log an exception. * * @param \Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); } /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) {// return parent::render($request, $exception); if (!$request->ajax() && ($exception instanceof TokenMismatchException)) { return redirect() ->back() ->withErrors('页面已过期 ,请刷新再试') // 错误提示信息 ->withInput($request->input()); // 可选 } return parent::render($request, $exception); }}

June 10, 2020 · 1 min · jiezi

Shadowfax-让Laravel佩上Swoole之剑

Swoole可以说是PHP的一把利剑,它拓展了PHP的边界,让众多PHPer们看到了高并发的曙光。利用Swoole来提高Laravel的性能,是一件非常值得投入的事情,这样既能获得Swoole的高性能,又兼顾了Laravel的高效率,两全其美。Shadowfax就是一款这样的拓展包,它简单易用,能够帮助开发者快速地将Laravel应用迁移到Swoole之上运行。 首先我们来看一下使用Shadowfax运行的Laravel应用的性能表现: 我使用wrk作为此次的benchmark工具,基于最新版的Laravel 7,但是移除了session相关的middleware。因为Laravel默认是启用了session的,而且session的驱动是file,如果在这种情况下去跑测试,每个请求都会创建一个session文件,这样跑出来的结果就没什么意义了。(追求性能的应用也不应该去使用file作为session驱动) 环境1: 硬件: 1 CPU, 4 Cores, 16GB MemoryMacOS 10.15.3PHP 7.3.12(启用opcache)Swoole 4.4.13Shadowfax 2(20个worker进程)这个环境也就是我个人的Macbook Pro,性能比较好。我用wrk启动4个线程,并发200进行压测: wrk -t4 -c200 http://127.0.0.1:1215/结果为 12430 rps: Running 10s test @ http://127.0.0.1:1215/ 4 threads and 200 connections Thread Stats Avg Stdev Max +/- Stdev Latency 26.44ms 31.44ms 212.73ms 84.28% Req/Sec 3.13k 839.99 6.07k 65.75% 124418 requests in 10.01s, 312.06MB read Socket errors: connect 0, read 54, write 0, timeout 0Requests/sec: 12430.20Transfer/sec: 31.18MB环境2: ...

June 7, 2020 · 1 min · jiezi

关于Laravel-与-Nginx-限流策略防止恶意请求

一、问题背景最近公司最近的几台线上服务器经常出现CPU覆盖过高,影响部分应用响应超时,产生了大量的短信和邮件报警,经过排查数据库日志和access.log,发现是API接口被刷,被恶意疯狂请求,最大一次大概120次/s。 之前没有过太多这方面经验,处理起来不是很顺畅,这次的问题刚好提了醒,经过这次的问题暴露,来记录一下解决方案和策略。 线上的部署方案是:nginx + laravel。 首先我们尝试从nginx层面入手,将占用更少的内存消耗,无需再转发到php-fpm上处理。 二、(恶意)请求特征想好很好的特征,就必须捕捉一定的特征,通过这个特征来有效的控制到恶意请求。 短时间内,IP对某接口产生大量请求user_agent,非正常信息或为空请求量比平时要高涨很多。三、限流策略(nginx)限制请求数首先的话.就是控制单IP时间上的请求次数和IP连接数,配置如下: http { limit_req_zone $binary_remote_addr zone=one:1m rate=1r/s; server { location /api/ { limit_req zone=one burst=5; } }}limit_req_zone主要控制单个IP的请求速率,使用漏桶算法来完成限制,limit_req_zone size,主要用于储存统计IP的请求信息,1M可以储存16000个IP,当每秒的请求超过了16000个的时候,其余访问都会被访问503 服务暂不可用。 上面的模板设置了,每秒最大不超过1个请求,最大延迟请求不超过5个。 如果我们的服务器每次接口的响应时间是在200ms-300ms,那我们对应的每秒的限制就应该设置成 1000ms / 接口响应耗时。 限制并发连接数限制完用户请求频率后,如果仍然还是存在很大的恶意请求,我们还可以进行并发数的限制。 http { limit_conn_zone $binary_remote_addr zone=one:1m; server { location /api/ { limit_conn one 10; } }}limit_conn_zone:主要是用于控制请求并发数,频率不能太快。 limit_conn_zone size跟limit_req_zone意思一致,可根据需要动态调控,上面的案例中,表示限制每个客户端IP最大并发连接数为10。 设定IP黑名单当某个IP请求过于频繁或者需要完全杜绝该IP的访问时,可以通过nginx的deny配置来禁止黑名单中的IP访问。 http { include blockip.conf; }黑名单配置 deny 195.91.112.66;deny 192.168.2.100;被添加黑名单后,再次访问就会出现403禁止访问. 限制UA(user-agent)信息http { server { if ($http_user_agent ~* "curl") { return 403; } }}上面就禁止了ua信息为curl的客户端,直接返回403。 ...

June 2, 2020 · 1 min · jiezi

Larvel-操作-MongoDB对内嵌数组增删改

PHP的MongoDB驱动中文文档:https://www.php.cn/manual/vie... PHP的MongoDB驱动官方文档:https://www.php.net/manual/zh... 有些细节都没写全,如想学习请阅读官方文档! 安装:https://blog.csdn.net/weixin_... 普通的增删改查与mysql驱动操作一样增$rs = DB::collection('集合名字')->insertGetId($param);$rs = DB::collection('集合名字')->insert($param);删$rs = DB::collection('集合名字')->where(["_id"=>1])->delete();改$rs = DB::collection('集合名字')->where(["_id"=>1])->update(['name'=<'遗失的美好']);查$result = DB::collection('集合名字')->where(["_id"=>1])->get();// 分页函数$results = DB::collection('集合名字')->paginate(10);// 这样也能做到分页 还有排序 orderBy() 排序函数,skip() 跳过几条 limit() 限制取出几条$rs = DB::collection('集合名字')->orderBy('age','asc')->skip(10))->limit(10)->get();对内嵌数组进行增删改,首先要知道MongoDB操作符:https://www.runoob.com/mongodb/mongodb-operators.html 增// 插入数组 $addToSet 插入时如果已经存在相同的则不插入 $rs = DB::collection('user_files_folder')->update(['$addToSet'=>['child'=>['name'=>'二傻子']])// 插入数组 $push 插入时如果已经存在相同的仍然插入$rs = DB::collection('user_files_folder')->update(['$push'=>['child'=>['name'=>'二傻子']])删$rs = DB::collection('user_files_folder')->update(['$pull'=>['child'=>['name'=>'二傻子']])改// 注意,这where条件如果需要多重结构则可以用.连接$set是修改操作符,对应修改对象(数组)修改对象如果需要多重结构也可以用.连接,这里的$符号代表对应的键(因为这里的数据结构是一个数组,$代表对应的序号,也可以写死成 0-9之类的数字)DB::collection('stock')->where(['info.id'=>"118b110212"])->update([ $set'=>[ 'info.$.id'=>"118b110jkjkjk" ]]);

May 26, 2020 · 1 min · jiezi

lumen-request-获取-header-头参数-token

lumen request 获取 header 头参数 token $token = $request->bearerToken();以下是校验 token 合法性的一个方法,可以用在中间件中使用: /** * 验证 token 合法性 * @param Request $request * @param $err * @return bool * @throws \Exception */ public static function checkToken(Request $request, &$err) { $token = $request->bearerToken(); if (!$token) { $err = 'token not found'; return false; } $user = []; //检查redis里边是否存在用户token if (Redis::exists(Constant::REDIS_TOKEN_PREFIX . $token)) { $userJson = Redis::get(Constant::REDIS_TOKEN_PREFIX . $token); if (!$userJson) { $err = 'data error'; return false; } $user = JsonHelper::decode($userJson); } else { //不存在,就请求GRpc获取 $client = new GRpcClient(); $params['session_id'] = $token; $ret = $client->setCmd(GRpcCmd::CHECK_LOGIN)->send($params); if (!is_array($ret)) { $err = 'token error:' . $client->getMsg(); return false; } //获取到之后就存到redis $user['id'] = $ret['user_id'];//用户ID $user['phone'] = $ret['phone'];//手机号 $user['channel'] = $ret['register_channel'];//注册渠道 $user['gold'] = $ret['gold'];//金币 Redis::setex(Constant::REDIS_TOKEN_PREFIX . $token, 7200, JsonHelper::encode($user)); } return true; }

May 26, 2020 · 1 min · jiezi