8 个关于 PHP 内存使用的问答
我努力探索在 PHP 中利用内存的最有效方法。这让我质疑这些方法是否有效。让我们将这些疑问转向 PHP 的内存使用,并通过一系列问题来探讨它们。
抱歉,我找不到第 9 题和第 10 题…
标签
我努力探索在 PHP 中利用内存的最有效方法。这让我质疑这些方法是否有效。让我们将这些疑问转向 PHP 的内存使用,并通过一系列问题来探讨它们。
抱歉,我找不到第 9 题和第 10 题…
每次运行 PHP 应用程序或其他软件时,它都会消耗内存。基本上,所有应用程序都需要内存来运行。随着所有这些应用程序争夺资源,计算机必须有效地分配内存。这使我们来到了内存管理过程。那是什么?
内存管理涉及释放、分配、组织和优化可用计算机内存,以确保程序正常运行。大多数情况下,计算机自动进行内存管理,但作为一名 PHP 开发者,你有责任管理你应用的内存占用。
本文将讨论您可以使用的技术来降低 PHP 应用程序的内存占用。
之前,我分享了一个为 Gdquest 创建的俯视角色视频。人们对这个小家伙的内部运作感到好奇,想知道创建这种角色使用了什么技术。
请注意,这里详细介绍的这种技术最适合自上而下的角色,但您可以为所有类型的深度效果做类似处理。
所有文件都可在 GitHub 上找到,您可以查看项目并阅读以了解其精髓 :)
云原生应用是专门为利用云计算资源和遵循云原生原则而设计的软件应用。
这些应用程序采用现代开发实践、架构和技术,以最大化云环境的好处。它们被容器化,打包成轻量级、可移植的容器,如 Docker,确保在不同环境中的一致部署。
基于微服务架构构建,它们分解为更小、独立的微服务,以实现灵活性和可扩展性。动态且可扩展,它们利用云原生技术进行自动扩展和编排,以处理不同的工作负载。
内置容错机制确保系统对故障具有弹性并保持高可用性。以 API 驱动和去中心化,通过定义良好的 API 促进无缝集成和协作。自动化是核心,通过持续集成/持续部署管道和自动化测试简化开发流程。优先考虑可观察性,具备全面的监控和日志记录功能,以实现实时问题检测和优化。
本质上,云原生应用是为云环境量身定制的,利用尖端技术和实践来提供可扩展、弹性好且敏捷的软件解决方案,以满足现代云计算的需求。
这个插件可以为 docker 自动补全指令并设置别名。
要在你的 zsh 终端里使用这个插件,请在 .zshrc
文件的插件列表里添加 docker
。
plugins=(... docker)
下面是 docker/cli git 仓库里自动补全脚本的副本: https://github.com/docker/cli/blob/master/contrib/completion/zsh/_docker
JavaScript 社区最近被一个新的包注册中心 JSR 点燃了热情,该项目来自开发 Deno 的团队。Deno 是一个基于 V8 JavaScript 引擎和 Rust 构建的 JavaScript、TypeScript 和 WebAssembly 的运行时。
Deno 团队一直致力于为 JavaScript 开发提出新的选择。在详细回顾了 Node 早期设计时的遗憾之后,Node.js 的创建者 Ryan Dahl 于 2018 年的 JSConf EU 会议上公布了 Deno 项目。这个项目的目的是提供一个更快、更安全的 JavaScript 运行时,Deno 团队还将 Node/npm 的兼容性作为 Deno 项目的核心组成部分。
为了推动 Deno 的发展,Deno Land Inc. 于 2021 年成立,资金由 Shasta Ventures 和 Mozilla Corporation 提供。一年后,Deno 在红杉资本领投的 A 轮融资中获得了 2100 万美元的额外资金。
JSR 是 Deno 为重新定义 JavaScript 包注册中心领域做法而做出的最新努力。与长期以来被 JavaScript 生态系统视为标准包注册中心的 npm 相比,JSR 有几个明显的技术差异。Deno 团队在 2023 年 SeattleJS 会议上非正式宣布了 JSR 项目,并在 2023 年更新的博文中附上了该项目的链接。
几周前,JSR 网站总结了 Deno 正在构建的内容:
很多人都听过可以用 Vite 在浏览器中实现热加载模块的能力,并以这种方式使用它。但 Vite 能做的更多,特别是对于现代解决方法,新的后端框架也倾向于支持 Vite 的开发服务器。其中之一是 Hono。
与 Express 这样的传统框架相比,Hono 是一个相对较新的框架。它采用现代 Web API 的无服务器设计确实吸引了我的眼球。使用 Vite,Hono 应用程序也能从热模块重载中受益,这为我们提供了一种开发全栈应用程序的全新方式。
我有机会说服我的同事(在我的新工作场所)从使用 Koa/Egg.js 框架和 Webpack 的旧架构切换到这种新的 Vite + Hono 组合,并从中受益匪浅。使用这种新的全栈架构,我们不仅设法减少了后端和前端之间不必要的划分,而且还提高了代码质量,因为 Hono 可以在后端和前端之间共享 API 类型。
所以,在这里,我将与想要拥抱 Web 开发新时代的人分享我使用这个新栈的经验。我们开始吧。
注意:Loco 基于 Axum,它是“包含所有功能的 Axum”,将您的 Axum 代码移至 Loco 非常容易。
我们将研究 realworld-axum-sqlx,它是一个基于 Axum 的应用程序,尝试使用 API、真实数据库和真实世界场景以及诸如配置和日志记录之类的真实世界的可操作性要求来描述一个真实世界的项目。
一点一点地研究 realworld-axum-sqlx
,我们将证明通过将它从 Axum 移至 Loco,大部分代码早已为您编写好,您将获得更佳的最佳实践、更好的开发体验、集成测试、代码生成和更快速的构建应用程序。
您可以使用这种分解方式来理解如何将您自己的基于 Axum 的应用程序也移至 Loco。如有任何问题,请在 discussions 中联系或点击绿色邀请按钮加入我们的 discord。
创建一个模板程序:
$ cargo install loco-cli
$ loco new
< 按照命令进行 >
现在 cd
进入你的应用程序,设置一个方便的 rr
别名并尝试各种命令:
$ cd myapp
$ cargo loco --help
你可以通过 CLI 在以下环境中驱动你的开发:
$ cargo loco generate model posts
$ cargo loco generate controller posts
$ cargo loco db migrate
$ cargo loco start
以及运行测试或使用 Rust 就像你已经知道的:
$ cargo build
$ cargo test
用 Loco 的预定义模板来简化项目的初始化,让你的开发过程更加顺畅。第一步,安装我们的 CLI 并选择最合适的模板。
cargo install loco-cli
创建一个应用:
loco new
✔ ❯ App name? · myapp
? ❯ What would you like to build? ›
❯ lightweight-service (minimal, only controllers and views)
Rest API (with DB and user auth)
Saas app (with DB and user auth)
loco
的配置位于 config/
中,默认情况下设置 3 种不同的环境:
config/
development.yaml
production.yaml
test.yaml
环境的选择依据如下:
cargo loco start --environment production
,如果没有给出,则回退到LOCO_ENV
或 RAILS_ENV
或 NODE_ENV
如果没有给出,则默认值为 development
。
Loco
框架除了默认环境之外,还支持自定义环境。要添加自定义环境,请创建一个配置文件,其名称与前面示例中使用的环境标识符匹配。
Webhook 是网络基础设施的重要组成部分。它诞生于 2007 年的一篇博文中,是一种使用所有人都熟悉的 HTTP 协议来消费异步数据流的简单方式。如今,Webhook 仍然基本保持原样,但已成为实现各种通知和集成云系统的事实标准。
在网络时代,什么相当于管道?
— 蒂姆·奥莱利
如今,Webhook 无处不在。对于 SaaS 和 API 公司来说,Webhook 是基本要求,拥有与其他云软件集成所需的最低开发成本。根据 SVIX 的说法,在排名前 100 的 API 公司中,83% 提供 Webhook。而对于 SaaS 企业来说,提供集成的第一步是通过 Webhook。因此,如果您正在构建云软件,那么您应该提供 Webhook 并开发它,对吧?
不完全是。
在 Rust 中输出日志有很多不同的库,因此选择其中一个库可能很困难。当 println!
、dbg!
和 eprintln!
无法满足你的要求时,拥有一种构建结构日志的方法非常重要,尤其是在生产级应用程序中。本文将帮助你了解在 Rust 中进行日志记录时,哪一个日志板库最适合你的用例。
要正确理解 Golang 范型编程 的概念,首先需要理解它旨在解决的问题。我们通过一个简单的例子来进行说明。
假设我们有一个简单的 Add()
函数,它接受两个整数并返回它们的和:
func Add(a, b int) int {
return a + b
}
func main() {
fmt.Println(Add(1, 2)) // 输出:3
}
这个函数对整数来说非常好用,但如果我们想让它接受浮点数呢?如果我们尝试用我们的 Add()
函数使用浮点数,就会遇到一个错误:
func main() {
fmt.Println(Add(1.1, 2)) // 错误:无法将 1.1(未类型化的浮点常量)用作参数 Add 的 int 值
}
现在,你可能会建议使用 接口 来解决这个问题,但这里有个问题。我们只希望 Add()
函数接受整数和浮点数,而不接受其他类型。很遗憾,仅使用接口无法实现这种程度的特殊性。
这性编就是 Golang 范程派上用场的地方了。
在我用过的所有基于 .NET 的应用中,访问外部(REST)API 的功能是通过 HTTP 协议实现的。针对这一需求,.NET 框架提供了多种实现方案,本文将介绍其中我最喜欢的实现方式。
在 .NET framework 时代调用 HTTP 请求并处理响应比现在复杂得多。一种流行的解决方案是使用 RestSharp 库,它隐藏了很多复杂性。
现在使用 dotnet(Core)HttpClient API 来进行 HTTP 请求则要容易得多,也没有必要再使用第三方库了。虽然有诸多的好处,但我们仍需注意一些问题。
JSR:解决 JavaScript 生态系统问题的包仓库
Deno 团队推出了一款名为 JSR 的新包仓库,旨在解决 JavaScript 生态系统中的诸多问题。我受邀抢先体验了这款仓库,并想分享一下我的感受。
Loco 是一个 Rust API 和 Web 框架,用于构建全栈产品。
Loco
这个名字源自 locomotive,是对 Rails 的致敬,而且 loco
比 locomotive
更容易输入 :-)。此外,在一些语言中它表示“疯狂”,但这并不是最初的意图(或者,在 Rust 上构建 Rails 是疯狂的吗?只有时间才能证明!)。
你需要对 Rust 有中等程度的了解。你需要知道如何构建、测试和运行 Rust 项目,已经使用了一些流行的库,例如 clap
、regex
、tokio
、axum
或其他 Web 框架,没有什么太花哨的。Loco 中没有疯狂的生命周期扭曲或复杂/过于神奇的宏,你不需要知道它们是如何工作的来使用 Loco。
Loco 深受 Rails 的启发。如果你了解 Rails 和 Rust,你就会有宾至如归的感觉。如果你只了解 Rails 并且不熟悉 Rust,你会发现 Loco 令人耳目一新。我们不假设你了解 Rails。
我们认为 Rails 非常棒,因此本指南也深受 Rails 指南 的启发
让我们在 loco
上通过 4 个命令创建一个博客后端。首先安装 loco-cli
和 sea-orm-cli
:
$ cargo install loco-cli
$ cargo install sea-orm-cli
现在你可以创建你的新应用(选择“Saas app”)。
$ loco new
✔ ❯ App name? · myapp
? ❯ What would you like to build? ›
lightweight-service (minimal, only controllers and views)
Rest API (with DB and user auth)
❯ Saas app (with DB and user auth)
🚂 Loco app generated successfully in:
myapp
Diesel CLI 是 Diesel 提供的一个可选工具,用于管理数据库 schema 。它的两个主要功能是运行数据库迁移和创建一个代表数据库 schema 的 Rust 文件。
Diesel CLI 的行为可以通过一个 toml 文件进行配置。默认情况下,Diesel 会在与 Cargo.toml
文件相同的目录下查找 diesel.toml
文件。您可以通过设置 DIESEL_CONFIG_FILE
环境变量或在命令行上传递 --config-file
来提供不同的配置文件。您可以通过运行 diesel setup
命令获得一个包含一些默认设置的基本配置文件。
在 Diesel 2.0 版本中,该文件包含一个名为 [print_schema]
的部分。此文件中的所有字段都是可选的。
在本教程中,我们将详细了解 diesel print-schema
命令和 table! 宏的作用。对于 table!
,我们将展示实际生成代码的简化版本,并解释每一部分对你的重要性。如果您曾经对生成的代码感到困惑,或者不明白 use schema::posts::dsl::*
代表什么,那么您现在处于正确的位置。要了解哪些类型在何处可用,另一种方法是打开您当前 crate 的 API 文档,通过运行 cargo docs --open
并导航到相关的模块。