Twitter 的 snowflake 在分布式生成唯一 UUID 应用还是蛮广泛的,基于 snowflake 的一些变种的算法网上也有不少。使用 snowflake 生成 UUID 很多都是在分布式场景下使用,我看了下网上有其中有几篇 PHP 实现的都没有考虑到线程安全。现在 PHP 有了 Swoole 的锁和协程的加持,对于我们开发线程安全和高并发模拟还是很方便的,这里用 PHP 结合 Swoole 来学习下实现最简单的 snowflake(好久没写 PHP,感觉没有 IDE 真写不了 PHP 了)。 先来看以下 snowflake 的结构: 生成的数值是 64 位,分成 4 个部分: 第一个 bit 为符号位,最高位为 0 表示正数 第二部分 41 个 bit 用于记录生成 ID 时候的时间戳,单位为毫秒,所以该部分表示的数值范围为 2^41 - 1(69 年),它是相对于某一时间的偏移量 第三部分的 10 个 bit 表示工作节点的 ID,表示数值范围为 2^10 - 1,相当于支持 1024 个节点 第四部分 12 个 bit 表示每个工作节点没毫秒生成的循环自增 id,最多可以生成 2^12 -1 个 id,超出归零等待下一毫秒重新自增 先贴下代码:

阅读全文

Laravel 的分页很方便,其实扩展起来也挺容易的,下面就来做个示例,扩展一下paginate()和 simplePaginate()方法,来实现我们自定义分页样式,比如显示“上一页”和“下一页”,而不是“《”和“》”,当然扩展的方法掌握了你就可以肆无忌惮的扩展一个你想要的分页了,比如跳转到某一页,分页显示一共多少记录,当前显示的记录范围等等巴拉巴拉的。。。 5.1 和 5.2 应该是同样的方法,我这里用的是 5.2 的版本。文档告诉我们Paginator 对应于查询语句构造器和 Eloquent 的 simplePaginate 方法,而 LengthAwarePaginator则等同于 paginate 方法。那我们还是来看下源码,具体这个 paginate 是如何实现render()的, Illuminate/Pagination/LengthAwarePaginator.php <?php namespace Illuminate\Pagination; ...... class LengthAwarePaginator extends AbstractPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Jsonable, LengthAwarePaginatorContract { ...... public function render(Presenter $presenter = null) { if (is_null($presenter) && static::$presenterResolver) { $presenter = call_user_func(static::$presenterResolver, $this); } $presenter = $presenter ?: new BootstrapThreePresenter($this); return $presenter->render(); } ...... } render()中传入的是一个Presenter的实例,并调用这个实例化的render方法来实现分页的显示的。如果没有则调用BootstrapThreePresenter 中render()的,来看看BootstrapThreePresenter是干嘛的

阅读全文

Larval 自带 Auth 密码重置源码解析及扩展实现手机号密码找回 Larval 技术群小伙伴问密码重置时 PasswordController 中需要设置的$broker是干嘛用的,正好来写一下 Laravel 中 Auth 的ResetsPasswords,以及实践一下扩展,所以大体这篇博客写写: 密码重置源码分析 实现自定义邮件发送方式进行密码重置,比如使用第三方或者自己发送邮件方式找回 实现手机号密码重置 首先来看一下 PasswordController 中的 ResetsPasswords trait trait ResetsPasswords { use RedirectsUsers; public function getEmail() { return $this->showLinkRequestForm(); } /** * 这里就是设置密码重置邮件内容的 * * @return \Illuminate\Http\Response */ public function showLinkRequestForm() { //所以我们可以在PoasswrodController 中设置 protected $linkRequestView 来定义密码重置邮件模板 if (property_exists($this, 'linkRequestView')) { return view($this->linkRequestView); } if (view()->exists('auth.passwords.email')) { return view('auth.passwords.email'); } return view('auth.password'); } /** * 发送密码重置邮件 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function postEmail(Request $request) { return $this->sendResetLinkEmail($request); } /** * 给重置密码的用户发送邮件 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function sendResetLinkEmail(Request $request) { $this->validate($request, ['email' => 'required|email']); $broker = $this->getBroker(); //获取broker,下面会讲 $response = Password::broker($broker)->sendResetLink($request->only('email'), function (Message $message) { $message->subject($this->getEmailSubject()); }); //根据 broker 来发送密码重置邮件,下面会详细讲 switch ($response) { case Password::RESET_LINK_SENT: //状态,下面会讲 return $this->getSendResetLinkEmailSuccessResponse($response); case Password::INVALID_USER: default: return $this->getSendResetLinkEmailFailureResponse($response); } } /** * 邮件标题 * * @return string */ protected function getEmailSubject() { return property_exists($this, 'subject') ?

阅读全文

重构 Laravel5.2 RBAC 示例

Laravel5 刚出来的时候写了一个简单的 Laravel RBAC 的示例,本来是自己熟悉一下 Laravel5.2 写着玩的,但是发现群里的小白对于这个需求还蛮多大的,于是又重新写了了一个。 项目地址:https://github.com/yuansir/laravel5-rbac-example 项目地址:https://github.com/yuansir/laravel5-rbac-example 安装 像 Laravel 安装步骤一样 配置 .local.env 中数据库连接信息 执行 composer php artisan db:seed 执行 php artisan serve 默认后台账号:admin@admin.com 密码:admin 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: 重构 Laravel5.2 RBAC 示例 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

阅读全文

Github :https://github.com/yuansir/vagrant Box ubuntu-14.04-amd64.box vagrant box add ubuntu/fuck path/to/ubuntu-14.04-amd64.box 目录文件说明 Vagrantfile vagrant 配置文件 bootstrap.sh vagrant provision shell 脚本 etc/ 开发环境所需的配置文件,暂时只有 nginx 和 supervisord,根据个人实际情况添加 hosts 在宿主机 hosts 需要添加的 IP 绑定,根据个人实际情况添加 projects/ 项目存放目录 scripts/ Vagrant Provision Shell,根据个人实际情况添加 其他 Vgrant 常用命令 vagrant init 初始化 box 的操作(本项目已配置好无需该操作) vagrant ssh 登录虚拟主机 vagrant up 启动虚拟机 vagrant box list 已添加 box 列表 vagrant box remove 删除 box vagrant destroy 停止当前正在运行的虚拟机并销毁所有创建的资源 vagrant halt 关机 vagrant reload 重新启动虚拟机,主要用于重新载入配置文件 vagrant suspend 挂起当前的虚拟机 vagrant resume 恢复前面被挂起的状态 vagrant ssh-config 输出用于 ssh 连接的一些信息 vagrant status 获取当前虚拟机的状态 默认启动安装软件 beanstalk composer mysql 5.

阅读全文

在 Laravel 的文档中有Package Development,对于入门开发人员来说还是比较抽象,因为开发一个包需要了解 Service Providers, Facade 已经够抽象的了对刚接触 Laravel 的开发人员来说,所以我来写一个简单的 Laravel 包开发的实例教程吧。 toastr.js是一个很方便的通知效果,最近刚发布了 laravel 5.2,所以就来开发一个 toastr for laravel 5 的包吧,主要用 toastr 结合 laravel 的flash session来实现页面的一次性消息提醒,其实这个在我们日常开发中页面操作提醒还是很常用到的业务。 一般的 laravel 包开发过程是这样的,开发好以后打包 push 到 gitlab,然后在packagist上提交,下面我们就来一步一步实现这个过程。 1.在新建的 laravel 项目中建立如下目录 packages/yuansir/toastr/src ,packages 目录和 app 目录同级。我们开发包的代码都放在这个 src 目录中,yuansir 和 toastr 完全自定义。 2.修改项目的 composer.json,设定 PSR-4 命名空间: "autoload": { "classmap": [ "database" ], "psr-4": { "App\\": "app/", "Yuansir\\Toastr\\": "packages/yuansir/toastr/src/" } }, 别忘了执行 autoload $ composer dump-autoload 3.为我们的包初始化一个 composer.

阅读全文

Laravel 如何在不同的环境调用不同的配置文件?社区这个问题问的蛮多,如何优雅的方法实现呢,应该有好多方法吧,我一般习惯用两种方法,设置环境变量,或者将环境值写入到.env 文件中去,不知道算不算优雅,有更优雅的方式欢迎告知。 1.设置环境变量,比如现在有本地开发和线上两个环境 本地配置 php-fpm(比如用 php-fpm 而不是 apache),比如环境变量为 DEV_ENV,修改 php-fpm.conf env[DEV_ENV]=local 然后设置本地系统的环境变量 echo "export DEV_ENV=local" >> /etc/profile source /etc/profile 让 Laravel 引入相应的配置文件,添加下面代码到 bootstrap/app.php 中 $environment = getenv('DEV_ENV') ? '.' . getenv('DEV_ENV') : ''; $app->loadEnvironmentFrom('.env'.$environment); 在 laravel 的项目中建立.env.local,其中的配置为本地开发环境的配置,.env 为线上环境,当然你也可以建立其他的的配置文件比如 .env.develop,.env.preview 等,根据实际情况添加配置文件和环境变量,在不同的环境下面会根据环境变量来调用不同的配置。这种方式的好处就是项目上线以后就不需要做设置,线上没有配置过 DEV_ENV 这个环境变量,所以上线项目会自动调用.env 中的配置 2.在.env 中写入当前环境的名称,,比如现在有本地开发和线上两个环境 清空.env 文件,只第一行写入当前运行的环境,比如 local 然后新建 .local.env 和 .production.env 分别写入本地和线上的配置项 将以下代码加入 bootstrap/app.php 中 $env = $app->detectEnvironment(function () { $environmentPath = __DIR__ . '/../.env'; $setEnv = trim(file_get_contents($environmentPath)); if(file_exists($environmentPath)) { putenv("APP_ENV=$setEnv"); if(getenv('APP_ENV') && file_exists(__DIR__ .

阅读全文

给公司没有用过 Laravel 的同事分享了一下 Laravel 框架 PPT地址:http://slides.com/ryanyuan/better-use-of-laravel-to-build-web-applications 觉得不错的如果愿意给博主微信捐赠 2 块钱更好 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: 让更好用的 Laravel 来构建 web 应用 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

阅读全文

####原文链接:《50 Laravel Tricks in 50 Minutes by willroth》 Eloquent 1.Automatic model validation class Post extends Eloquent { public static $autoValidate = true; protected static $rules = array(); protected static function boot() { parent::boot(); // You can also replace this with static::creating or static::updating static::saving(function ($model) { if($model::$autoValidate) { return $model->validate(); } }); } public function validate() { } } 2.Prevent updating class Post extends Eloquent { protected static function boot() { parent::boot(); static::updating(function ($model) { return false; }); } } 3.

阅读全文

最近在给 OpenCart 集成支付宝,财付通和微信扫码支付,其实这些插件都是有的卖的,但是还蛮贵的,还是自己开发集成吧,省钱。但是集成过程中发现了一些坑,有 opencart 的坑,也有支付 sdk 的坑,浪费了不少时间,这里整理几条,给需要的人跨坑。 微信 native 模式二中的 notify_url 地址必须是公网地址 支付宝的 notify_url 不能是 query string 的形式,比如 xxx/notify.php?route=a/b,只能为 xxx/notify.php OpenCart 中支付宝和财付通中的同步回调处理中最好 unset($_GET[‘route’])再做支付回调验证,否则因为这个多余的参数参与校检导致回调验证不成功 微信回调 notify 的时候是发送数据流,所以 GET 和 POST 是获取不到支付后异步通知过来的数据的,用官方的 SDK 的时候你可以这样改一下: $GLOBALS['HTTP_RAW_POST_DATA'] = file_get_contents('php://input', 'r'); $notify = new PayNotifyCallBack(); $notify->Handle(false); PC 浏览器的支付宝用 ios 设备访问的时候会弹出支付宝客户端来支付,这样是接收不到异步和同步通知的,所以需要判断一下访问设备是移动端还是客户端,如果是移动端的话得用支付宝的 wap 方式来支付 财付通支付 QQ 浏览器支付一直参数错误,还没找到为什么 转载请注明: 转载自Yuansir-web 菜鸟 | LAMP 学习笔记 本文链接地址: OpenCart 开发支付宝,财付通,微信支付接入遇到的坑

阅读全文

作者的图片

Ryan是菜鸟 | LNMP技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京