Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
2
篇与
的结果
2023-08-12
Hyperf 3.0
Hyperf 3.0回顾在过去的一年半时间里,Hyperf 2.2 共发布了 35 个小版本,使 Hyperf 达到了一个前所未有的高度,这里也获得了一些不错的数据反馈。Hyperf 在 GitHub 和 Gitee 上的关注度也得到了显著提升,分别获得了 4.9k 和 791 个 star,整体关注度增长也很稳定。Hyperf 框架的安装量也达到了 90万次,每天都有约 1300次的安装,这也表明了 Hyperf 已经广泛应用于相关行业中并支撑了大量的系统运行。Hyperf 组织下的有效 repo 更是达到了约 140个(去除掉 Archive 项目后),维护工作量空前巨大,但迭代仍然高频。感谢 Hyperf 团队全体成员的辛勤以及贡献,同时也感谢所有的 PR 贡献者,没有你们的参与也就没有今天的 Hyperf。Thanks ALL ContributorsHyperf 3.0 新时代Hyperf 3.0 带来了很多非常有意思的新能力,其中一些新能力不乏是 PHP 领域里面前所未有的,当然这些新能力也脱离不了其他开源社区的积极发展,包括但不限于 PHP、Swoole、Swow、PHPMicro、DTM、Seata 等开源社区,也衷心希望大家在闲暇时间可以为这些开源社区也贡献出自己的一份力,搭上一砖一瓦,共建更加美好的未来。原生注解 (Attribute)随着 PHP 8.1、8.2 的发布,给 PHP 带来了很多新的特性,其中与 Hyperf 最为相关的就是 PHP 的原生注解(Attribute) 了,Hyperf 3.0 也放弃了过往采用的基于注释解析的注解功能实现,转而采用 PHP 的原生注解,当然对应依赖的 PHP 版本,也将调整为最低要求 PHP 8.0。我们以一个最简单的 Controller 案例来呈现新的原生注解的使用:<?phpdeclare(strict_types=1);namespace App\Controller;use Hyperf\HttpServer\Contract\RequestInterface;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\RequestMapping;[Controller]class IndexController{// Hyperf 会自动为此方法生成一个 /index/index 的路由,允许通过 GET 或 POST 方式请求 #[RequestMapping(path: "index", methods: "get,post")] public function index(RequestInterface $request) { // 从请求中获得 id 参数 $id = $request->input('id', 1); return (string)$id; }}同时随着原生注解的应用,在 3.0 中也能够支持在同一个位置重复应用同一个注解了,比如过往在一个 Controller Action 想要应用多个 Middleware 时,需要通过 @Middlewares 注解包含多个 @Middleware 注解实现应用,而在 3.0 则可直接书写多个 @Middleware 注解实现该应用。同时在 3.0 中,注解也可以应用在方法的参数上,以实现一些针对方法参数定义、参数解析等功能。从 注释注解 调整为 原生注解,也无需担忧过往项目的迁移改造工作量,Hyperf 也提供了对应的工具一键自动转换,只需要在 2.2 时引入 hyperf/code-generator 组件,并执行 php bin/hyperf.php code:generate -D app 命令,即可将 app 文件夹内的注释注解自动转为原生注解,轻松省力~分布式事务在过去的一年里,Hyperf 团队也为 PHP 领域孵化了两个前所未有的分布式事务组件并贡献到对应的开源社区,对应 DTM (首个基于 Go 语言实现的流行分布式事务管理器) 与 Seata (由阿里巴巴开源的流行分布式事务管理器) 两款主流的开源分布式事务管理器,分别是 dtm-php/dtm-client 和 seata/seata-php ,其中 dtm-php 是实现了 dtm 完整功能的分布式事务客户端,已支持 TCC模式、Saga、XA、二阶段消息模式的分布式事务模式,并分别实现了与 DTM Server 以 HTTP 协议 或 gRPC 协议 通讯,该客户端可安全运行于 PHP-FPM 和 Swoole 协程环境中,更是对 Hyperf 框架做了更加易用的功能支持,可应用于生产环境中,而 seata-php 仍在开发迭代中,尚未能用于生产环境,也希望能有更多人参与进来共同迭代。我们也以一个简单的例子来说明如何在 Hyperf 中实现一个 TCC 分布式事务的调用,其它分布式事务模式可查阅 dtm-php repo 的 README 文件,或 Hyperf 3.0 文档关于分布式事务一章。<?phpnamespace App\Controller;use DtmClient\TCC;use DtmClient\TransContext;use Hyperf\Di\Annotation\Inject;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\GetMapping;use Throwable;[Controller(prefix: '/tcc')]class TccController{protected string $serviceUri = 'http://127.0.0.1:9501'; #[Inject] protected TCC $tcc; #[GetMapping(path: 'successCase')] public function successCase() { try { $this->tcc->globalTransaction(function (TCC $tcc) { // 创建子事务 A 的调用数据 $tcc->callBranch( // 调用 Try 方法的参数 ['amount' => 30], // Try 方法的 URL $this->serviceUri . '/tcc/transA/try', // Confirm 方法的 URL $this->serviceUri . '/tcc/transA/confirm', // Cancel 方法的 URL $this->serviceUri . '/tcc/transA/cancel' ); // 创建子事务 B 的调用数据,以此类推 $tcc->callBranch( ['amount' => 30], $this->serviceUri . '/tcc/transB/try', $this->serviceUri . '/tcc/transB/confirm', $this->serviceUri . '/tcc/transB/cancel' ); }); } catch (Throwable $e) { var_dump($e->getMessage(), $e->getTraceAsString()); } // 通过 TransContext::getGid() 获得 全局事务ID 并返回 return TransContext::getGid(); } }至于其它事务模式,如 Saga、XA、二阶段消息模式等,可以具体查阅 dtm-php/dtm-client 仓库的 Readme 文件或 Hyperf 3.0 的相关文档。Swow 网络引擎实际上在 Hyperf 2.2 中,就已经支持了 Swow 网络引擎的运行,随着 Swow 1.0 正式版的发布,在 Hyperf 3.0 中,我们也把 Swow 的应用提高到了一个更高的高度,Swow 实现了一套有史以来最完整的 PHP 协程模型,它全面释放了 PHP 的真正实力,使得开发者可以做到以往难以想象的事情,对比 Swoole 它具备更好的兼容性、可调试性、可编程性,它甚至能使 Hyperf 运行于原生 Windows 环境下而无需借助 WSL 或 Docker,同时也提供了 SDB 和 Watchdog 工具对协程运行进行调试和监控,极大的提升了 Hyperf 的可调试性。我们提供了一个全新的 Skeleton 骨架项目用于快速创建一个基于 Swow 网络引擎的 Hyperf 应用,以下是一个简单的通过 Composer 创建应用的流程:composer create-project hyperf/swow-skeleton:dev-master 创建后,确保您的 PHP 环境已经安装好了 Swow 扩展,便可直接通过 php bin/hyperf.php start 命令启动服务,整体使用与原来无异,Hyperf 底层已做好了适配。在 Windows 环境中也只需在 CMD 或者 Poweshell 中运行即可哦~SDB 协程调试器SDB 是一款使用 PHP 语言编写的协程调试器工具,使用上类似于 GDB,它具有以下的几个优点:使用简单,只需要一行代码即可开启;无需端口,可直接运行在 TTY 上;零成本,可在生产环境使用,不影响性能;功能强大,深度定制,量身打造类微型操作系统;通过 SDB,您可以对运行中的 Hyperf 应用进行交互,以实现查看当前所有协程状态、窥视协程、进入指定协程、查看调用栈、打断点、单步调试、查看及修改变量调试、扫描僵尸协程、Kill 协程等操作,真正意义上的将 PHP 协程带到了工程化的实用阶段。WatchdogWatchdog 为 PHP 提供了 CPU 调度能力,其核心原理是 Watchdog 线程会定期检查其它线程中协程的活跃度情况,若发现工作线程中的协程不再活跃,则通过 ZendVM 的中断机制对其进行状态确认,若 VM 中断失败,则表明工作线程陷入了系统调用阻塞,触发告警;若 VM 中断成功,则表明工作线程陷入了 CPU 密集运算或死循环,则立即触发用户设定的调度规则进行调度。通过 Watchdog 可以实现 可编程的协程调度机制,可以非常方便的解决过往头疼的 CPU 饥饿 问题,以下是一些用法的演示:// 运行超过 1ms 就让出控制权\Swow\WatchDog::run(1 1000 1000);// 运行超过 1ms 就让出 10ms,调度失败并超过 5ms 时视为系统调用阻塞\Swow\WatchDog::run(1 1000 1000, 5 1000 1000, 10);// 可编程方式,函数会在程序阻塞 100ms 后触发$alertCountMap = new WeakMap();\Swow\WatchDog::run(quantum: 100 1000 1000, alerter: static function () use ($alertCountMap): void {$coroutine = Coroutine::getCurrent(); $alertCount = ($alertCountMap[$coroutine] ??= 0) + 1; $alertCountMap[$coroutine] = $alertCount; echo 'CPU starvation occurred, suspend this coroutine...' . PHP_EOL; sleep(0); if ($alertCount > 5) { echo 'Kill the bad guy' . PHP_EOL; $coroutine->kill(); }});更多用法关于 SDB 和 WatchDog 以及更多用法目前文档可能尚未完善,我们接下来也会编写多篇文章来阐述用法,也会尽快完善相关文档~BoxBox 是一个致力于帮助提升 PHP 应用程序的编程体验的工具,尤其有助于 Hyperf 应用,可以用于管理 PHP 环境和相关依赖,同时提供将 PHP 应用程序打包为二进制程序的能力,还提供反向代理服务来管理和部署 Swoole/Swow 服务。这些能力也是前所未有的,特别是将 Hyperf 或 PHP 应用打包为二进制程序的能力,打包好的程序,可以不依赖系统的 PHP 环境单独运行,以达到类似于 Go 语言的打包能力,这些能力也得益于 phpmicro 的发展,而 Box 则是站在巨人的肩膀上,将这些能力以更加简单易用的方式提供给大家使用~以下是一个通过下载 Box 到创建一个 Hyperf 应用,并运行的简单案例:安装 Box// Macwget https://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_macos -O boxsudo mv ./box /usr/local/bin/boxsudo chmod 755 /usr/local/bin/box// 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 box 放到你想要的任意 $PATH 路径中// Linux x86_64wget https://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_linux -O boxsudo mv ./box /usr/local/bin/boxsudo chmod 755 /usr/local/bin/box// 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 box 放到你想要的任意 $PATH 路径中// Windowscurl -o box.exe https://github.com/hyperf/box/releases/download/v0.5.5/box_x64_windows.exe// 将 box.exe 放到你想要的任意 Path 环境变量路径中,同时 Windows 版本在执行时需要在命令行中使用 box.exe 而不是 box初始化 Github Access TokenBox 需要一个 Github 访问令牌来请求 Github API,以便于从 GitHub Actions 的 Artifacts 中检索包的版本。创建 Github Access Token,workflow 范围需要勾选;运行 box config set github.access-token 命令来设置您的 token;我们将在 v0.6 版本让使用 Box 前无需设置 Github Access Token,以提供更加简便的使用体验,请期待~通过 Box 初始化 PHP 环境并启动 Hyperf// 通过 box 安装 PHP 8.1,此安装不会影响系统原来自身安装的 PHPbox get php@8.1// 通过 box 安装 composerbox get composer// 通过 box composer 创建 hyperf 应用,可指定 dev-master 分支以防止 packagist 代理数据落后的问题box composer create-project hyperf/swow-skeleton:dev-master// 通过 box 启动 hyperfbox hyperf start至此一个完整的安装和运行流程已完成,我们可以发现过往复杂的环境部署环节,已经简化为了区区几个命令,通过 && 连接符甚至可以组成一行命令足以。通过 Box 打包 Hyperf 应用为二进制程序这个神奇的能力,在操作上也被简化得匪夷所思,只需预先执行 box build-prepare 命令提前下载好相关依赖,这个命令只需执行一次即可,后续即可通过 box build 命令对当前所在文件夹的 Hyperf 应用进行打包动作。打包好后,当前文件夹会出现一个名为 hyperf 的二进制文件,后续只需要通过 hyperf start 命令即可启动该 Hyperf 应用。Box 自身就是一个基于 Box 打包出来的 Hyperf 应用,大家也可以通过了解 Box 项目本身,来了解该能力的使用。Box Kernel 切换默认情况下,Box 由 Swow Kernel 提供支持,但是我们也提供了 Swoole Kernel,您可以通过 box config set kernel swoole 来切换为 Swoole Kernel,但是需要注意的是,Swoole Kernel 仅支持 PHP 8.1 版本,且不支持构建二进制程序功能和 Windows 系统环境。// 设置为 Swow Kernel [默认]box config set kernel swow// 设置为 Swoole Kernel (不支持 Windows)box config set kernel swooleBox 的更多能力Box 还有更多有意思的使用方法和工具组合,可以通过下面的部分的命令清单快速一览命令box get pkg@version从远程安装包,pkg是包名,version是包的版本,box get pkg表示安装最新版本的 pkg,例如, 运行 box get php@8.1 安装 PHP 8.1, 运行 box get composer 安装最新的 composer binbox build-prepare 为 build 和 build-self 命令做好相关环境的准备box build-self 构建 box bin 本身box build 将 Hyperf 应用程序构建成二进制文件box self-update 将 box bin 更新至最新版本box config set-php-version 设置 box 的当前 PHP 版本,可用值:8.0 | 8.1box config get-php-version 获取 box 的当前设置的 PHP 版本box reverse-proxy -u <upsteamHost:upstreamPort> 启动一个反向代理 HTTP 服务器,用于将 HTTP 请求转发到指定的多个上游服务器box php 通过当前 box 的 PHP 版本运行任何 PHP 命令box composer 通过当前 box 的 PHP 版本运行任何 Composer 命令box php-cs-fixer 通过当前 box 的 PHP 版本运行任何 php-cs-fixer 命令box cs-fix 通过当前 box 的 PHP 版本运行 php-cs-fixer fix 命令box phpstan 通过当前 box 的 PHP 版本运行任何 phpstan 命令box pint 通过当前 box 的 PHP 版本运行任何 pint 命令更多优化Hyperf 3.0 仍做了大量的优化和调整,具体可以阅读 Hyperf 主仓库中的 CHANGELOG-3.0.md 文件。同时我们也为大家准备了一份从 2.2 升级至 3.0 的指南,具体可查阅 Hyperf 官方文档 - 3.0 升级指南 一章。相关链接Hyperf 的详细介绍:点击查看Hyperf 的下载地址:点击下载
2023年08月12日
15 阅读
0 评论
0 点赞
2023-08-11
如何为开源PHP软件包做贡献
如何为开源PHP软件包做贡献介绍鉴于即将举行的Hacktoberfest,我想为初学者分享一些技巧,这些初学者可能想专门为PHP 软件包做出第一笔贡献。从我自己的经验来看,与“常规”(Laravel)应用程序相比,在一个程序包上工作可能看起来很艰巨。这篇文章旨在为初学者贡献一些开源PHP软件包的指导。步骤1.在GitHub上Fork软件包例如,假设我们要处理laravel-medialibrary软件包。首先,将包Fork到GitHub上,因为我们(可能)无权将分支推送到主存储库。分支将充当我们软件包的“工作副本”,并在中心位置push包含您的工作的分支。步骤2.克隆你的Fork将包fork克隆到本地计算机。我个人有一个单独的文件夹,用于“应用程序”和“程序包”。将包从你的fork克隆到本地计算机。就我个人而言,我有一个单独的文件夹为"applications"和"packages"。cd packagesgit clone git@github.com:Jhnbrn90/laravel-medialibrary.git .步骤3.在(Laravel)项目中Require包在应用程序中Require克隆的软件包,以测试所需的功能或错误修复。例如,此应用程序可以是Laravel的全新安装,但并非必须如此。就个人而言,我总是创建一个名为“ hacktober”的新Laravel应用程序。在这个应用程序中,通过在composer.json文件中定义一个所谓的自定义repository,你可以从本地require包,而不是通过Packagist。将“ url”替换为软件包所在的目录。{ "scripts": { ... },"repositories": [{ "type": "path", "url": "../../packages/laravel-medialibrary" }]}由于Composer使用指定的repositories作为后备,因此您需要在 composer.json 中更新包的名称。否则,它将只使用Packagist的Spatie的最新版本的laravel-medialibrary包。您可以在composer.json中按以下方式重命名程序包:{ "name": "JhnBrn90/laravel-medialibrary", ....}重要提示: 切勿提交此更改!在Laravel应用程序中Require该软件包:composer require JhnBrn90/laravel-medialibrary这将创建到本地软件包的符号链接,而不是从Packagist安装软件包。第4步:提交工作您在软件包中所做的所有更改现在都将直接反映在用于测试软件包的应用程序中。按照项目贡献准则中的说明,为该功能或错误修复程序创建一个新的分支,通常在CONTRIBUTING.md文件中进行描述。git checkout -b feature/some-feature在尝试通过相关代码段分隔提交的同时,在此分支上提交您的工作。用GitHub的桌面工具,可以很容易地将更改分别提交。步骤5.Push分支如果您对工作的当前状态感到满意,则可以将分支push到自己的存储库分支中。git push --set-upstream origin some-feature推送您的分支后,GitHub很可能会提供一个URL以直接创建新的PR。或者,您可以通过GitHub的Web界面创建PR。步骤6.创建一个新的PR现在您已经有了一个包含工作的分支,您可以根据贡献准则(最常见的是master或develop)向分支创建一个新的拉取请求(pull request)。使用 Pull Requests选项卡中的“New pull request”按钮,并确保启用“compare across forks”。这允许您从fork上的分支创建到基本存储库的 PR。从头开始创建新的PR写一个好的描述理想情况下,PR应该易于理解,并且意图明确:你为什么要做/改变一些东西如何运作别人如何测试PR有时,需要先进行PHPUnit或端到端测试,然后才能接受PR。如果您发现这一挑战,您可以随时询问维护人员,是否有人可以稍后将其添加到您的PR中。良好描述的示例如下:解决问题#13做了什么(为什么)确认对话框已添加到“重置操作”按钮,以防止意外重置。它是如何工作的确认modal的视图已添加回调已添加到onClick操作中,这将打开一个新的确认modal此外,该回调接受参数X和Y能够...,请参见下面的代码示例:public function showConfirmationDialog($x, $y){ // Add a code example to clarify the PR} 测试方法单击“重置”,确认modal并断言计数器已重置单击“重置”,取消modal并断言计数器未重置Todo这些是我不确定的事情添加测试:断言单击“取消”不会重置计数器断言单击“确认”会重置计数器摘要我希望建议的工作流程可以帮助初学者对PHP软件包充满信心。如果您想了解有关创建Laravel特定软件包的详细信息,请确保签出以下资源:LaravelPackage.comLaravel包装培训PHP软件包开发课程进阶技巧配置upstream虽然是可选的,但我建议您也将我们从中分叉软件包的存储库配置为“上游”存储库。这使我们可以在以后阶段从此存储库中获取更改,例如,与此同时,当PR合并到主数据库中时。While optional, I would advise to also configure the repository where we forked the package from as an "upstream" repository. This allows us to pull in changes from this repository at a later stage, for example when a PR was merged into master in the meantime.我们可以使用以下git remote add命令添加此远程仓库:git remote add upstream git@github.com:spatie/laravel-medialibrary.git运行时git remote -v,您现在应该看到两个单独的远程仓库:“ origin”指的是您自己的存储库,“upstream”指的是原始存储库。使用最新更改更新(rebase)您的PR当您处理问题或功能时,可能会在创建您的PR之前将其合并。在这种情况下,最好master在上游存储库中引入最新更改。While you work on an issue or feature, it might happen that another PR was merged before you created yours. In that case, it might be a good idea to pull in the latest changes on master in the upstream repository.在您当前正在开发的分支中并入master(或develop)中的更改,如下所示:Incorporate changes in master (or develop) in the branch you're currently developing on as follows:确保工作分支上的所有更改都已提交并且工作目录是干净的Pull in the latest version of master from the upstream repository:git checkout mastergit pull upstream masterRebase your feature branch on the latest version of master:git checkout feature/some-featuregit rebase mastervia https://johnbraun.blog/posts/contributing-to-a-PHP-package推荐:在线生成软件包样板https://laravelpackageboilerplate.com/#/
2023年08月11日
23 阅读
0 评论
0 点赞