分类: 软件

  • 让我们一起探索 WordPress 插件开发的神秘之旅 — 钩子(Hooks)

    你是一名 WordPress 开发者,或者是一个对 WordPress 插件开发充满好奇的新手吗?如果是,那么你来对了地方。让我们一起踏上探索 WordPress 插件开发的神秘之旅。今天我们将重点了解一个关键的概念 — 钩子(Hooks)。

    在插件开发的世界中,钩子就像是一条纽带,它将你的代码与 WordPress 的核心代码相连接,使之成为 WordPress 功能的一部分,而无需直接修改核心代码。这种设计使得用户可以方便地升级到 WordPress 的新版本,而无需修改任何代码。

    钩子是如何工作的?

    钩子的工作原理非常简单:当 WordPress 的工作流程到达某一点时,它会检查是否有任何函数需要”钩入”(即插入)到这一点。如果有,这些函数就会被执行。这就是所谓的“动作钩子”。

    另一种类型的钩子是“过滤器钩子”。这种钩子允许你修改 WordPress 生成的数据,然后返回修改后的数据。这使得你可以在不改变原始数据的情况下,改变数据的显示方式。

    钩子在插件开发中的重要性

    没有钩子,插件就无法改变 WordPress 的功能。钩子系统贯穿整个插件开发过程,几乎每一个插件的开发中都会用到。在你学会了钩子的用法后,你就会明白为什么 WordPress 这个平台这么强大,并有上千个插件供几百万用户使用了。

    如何在插件中使用钩子?

    在你的插件中使用钩子非常简单。首先,你需要确定你需要在何处插入代码。然后,你需要创建一个函数,这个函数将包含你需要执行的代码。最后,你需要告诉 WordPress 在何时执行你的函数,这就是你需要使用的动作钩子。

    过滤器钩子的使用方式几乎相同。你需要创建一个函数,这个函数会接收原始数据,修改它,然后返回。然后,你需要告诉 WordPress 在何时执行你的函数,这就是你需要使用的过滤器钩子。

    如何在类中使用钩子?

    在类中使用钩子与在函数中使用钩子非常相似。你只需要在添加动作或过滤器时,将函数名替换为一个数组,数组的第一个元素是类的实例(通常是 $this),第二个元素是方法名。

    在 WordPress 中,过滤器钩子(Filter Hook)是一种用于修改或过滤数据的机制。它允许开发者在特定的时间点拦截和修改数据,并返回修改后的结果。过滤器钩子广泛应用于 WordPress 的核心功能和插件开发中,提供了一种灵活的方式来自定义和扩展 WordPress 的行为。

    过滤器钩子包含两个关键元素:钩子名称和回调函数。钩子名称是用来标识特定的过滤器的字符串,而回调函数则是在钩子触发时执行的代码。回调函数接受一个或多个参数,并返回经过修改后的数据。

    下面是一个示例,演示了如何创建并使用一个过滤器钩子:

    // 创建一个过滤器钩子
    function my_custom_filter( $data ) {
        // 修改数据
        $modified_data = $data . ' (Modified)';
        
        // 返回修改后的结果
        return $modified_data;
    }
    add_filter( 'my_custom_filter_hook', 'my_custom_filter' );
    
    // 在钩子触发时调用回调函数
    $data = 'Hello';
    $filtered_data = apply_filters( 'my_custom_filter_hook', $data );
    
    // 输出修改后的结果
    echo $filtered_data; // 输出:Hello (Modified)
    

    在上面的示例中,我们首先定义了一个名为 my_custom_filter 的回调函数,它接受一个参数 $data 并返回修改后的结果。然后,我们使用 add_filter 函数将这个回调函数添加到名为 my_custom_filter_hook 的过滤器钩子上。

    最后,我们使用 apply_filters 函数来触发钩子并调用回调函数。我们将字符串 'Hello' 作为参数传递给 apply_filters 函数,然后它将调用 my_custom_filter 函数并返回修改后的结果。最后,我们将修改后的结果输出到屏幕上。

    通过使用过滤器钩子,您可以在 WordPress 中的许多地方拦截和修改数据。这使得您能够以非常灵活的方式自定义和扩展 WordPress 的功能,无需修改核心代码或插件的源代码。

    创建自定义钩子

    作为插件开发者,你不仅可以使用 WordPress 内置的钩子,还可以创建自己的钩子,供其他插件和模板使用。这使得你的插件更灵活,更易于扩展。

    在哪里可以找到钩子?

    你可以在 WordPress 的核心代码中找到所有的钩子,或者在网上查找钩子的参考列表。你也可以搜索如 “do_action”、”do_action_ref_array”、”apply_filters”、”apply_filters_ref_array” 等关键字,以找到更多的钩子。

    掌握了钩子的使用,你就拥有了改变 WordPress 功能的强大工具。所以,让我们一起开始这段神奇的插件开发之旅吧!希望你在这个过程中找到乐趣,并拥有一次丰富的学习体验。

  • 钩子(Hooks):WordPress 插件开发的神器

    各位WordPress的同仁们,你们是否曾被插件开发中的一些问题困扰,想要修改WordPress的工作流程却又不敢动核心代码?今天,我要给大家介绍一个强大的工具,那就是我们的主角——钩子(Hooks)。它就如同一把神奇的钥匙,能让我们无需直接修改核心代码,就可以改变WordPress的工作方式。这将使得我们在升级WordPress时无需担心代码的兼容问题。

    钩子:WordPress的精髓

    钩子是WordPress的精髓所在,它允许我们在插件开发中插入代码,改变WordPress的工作流程。这样,我们就可以在不直接修改核心代码的情况下,方便的升级WordPress的新版本,而不需要修改任何代码。

    如果我们直接修改了核心代码,那么在下一次WordPress升级时,所有的改动就会被覆盖掉。而使用钩子,我们可以在核心目录之外单独开发插件,这样就保证了代码在升级时的安全性。

    没有钩子,插件就无法改变WordPress的功能。钩子系统会贯穿整个插件的开发过程,而且在几乎每一个插件的开发中都会用到。掌握了钩子的用法,你就会明白为什么WordPress这个平台这么强大,并有上千个插件供几百万用户使用。

    两类钩子:动作钩子和过滤器钩子

    WordPress主要有两种类型的钩子:动作钩子和过滤器钩子。动作钩子(Action Hooks)让我们可以在特定的时刻执行一个函数,而过滤器钩子(Filter Hooks)则让我们可以操作通过钩子的输出。这两种钩子都是开发插件时的重要工具。

    动作钩子让你可以在WordPress加载过程中或者当某个事件发生的特定时刻触发一个函数。比如,你可能想要在WordPress加载一个页面或者保存一篇文章时执行一个函数。

    过滤器钩子则让你可以对通过钩子的数据进行修改。比如,你可以修改文章的内容,或者更改网站的标题等。

    钩子的使用

    要使用钩子,我们需要使用到 do_action() 和 add_action() 这两个函数。do_action() 是触发一个动作钩子,而 add_action() 是向一个动作钩子添加一个函数。

    例如,我们可以在前台的 <head> 里面添加一个名为 wp_head 的钩子,这个钩子经常被用来添加 meta 信息,样式表,和 js 脚本。

      do_action('wp_head');
    

    当这段代码在WordPress中执行时,它会寻找任何为 wp_head 动作钩子注册的动作,然后按照特定顺序执行它们。

    要向一个动作钩子添加一个函数,我们需要使用 add_action() 函数。例如,我们可以向 wp_footer 钩子添加一个函数,这个函数会在每次页面加载时执行。

    add_action( 'wp_footer', 'your_function' );
    

    其中,'wp_footer' 是你的函数执行时的动作钩子的名称,'your_function' 是你希望WordPress调用的函数名。

    结语

    钩子是WordPress插件开发中的一个强大工具,它让我们能在不改变核心代码的情况下,改变WordPress的工作流程。

  • 一步一步学习Penrose:创造美丽的数学图像

    大家好!欢迎来到这篇关于Penrose的博客文章。准备好开启创造美丽图像的旅程了吗?无论你是数学领域的专家,还是编程初学者,Penrose都可以为你提供一个友好的平台,让你轻松地创造出令人惊叹的图形。

    Penrose: 一个新的视角

    我们经常会用笔或者铅笔来画出我们理解的概念,让它们从抽象变为具体。那么在Penrose中,我们是如何创造图像的呢?让我们来看一个简单的例子。假设我们想要画出你家的物品,首先我们需要确定我们的领域,也就是你家中的所有物品。然后,我们列出所有我们想要在图像中展示的物体,这些物体在Penrose中被称为”物质”。例如,你的椅子就是你家中的一个特定的物体。

    接下来,我们需要找出这些物体之间的关系。比如,我们可以根据家中的植物每周需要浇水的次数来对它们进行分组,这样我们就可以得到一个关于植物的视觉集群图。然后,我们可以尝试使用不同的颜色、大小和组合来绘制图像,同一个概念可以用不同的风格来表现。

    用Penrose来创造美丽的图像

    Penrose的主要目标是从数学陈述中创建美丽的图像。如果一个椅子是房子中的一个物体,那么一个向量也可以是线性代数中的一个物体。使用Penrose,你可以构建任何你想要可视化的数学领域。

    要使用Penrose创建图像,我们需要在三个特定的文件中编写代码。首先,我们需要定义我们的物体领域,因为Penrose并不知道你的家中有什么,也不知道什么是椅子。除了定义你的领域中的物体类型,你还需要描述你的领域中可能的操作。其次,我们需要存储我们想要在图像中包含的特定物质,这样Penrose才知道具体要为你画什么。最后,我们需要定义我们想要用来可视化我们的物质的样式。

    这三个文件分别对应于:

    • .domain文件,定义特定领域的语言。
    • .substance文件,创建数学内容的物质。
    • .style文件,指定视觉表示的样式。

    在一般情况下,每一个图像都会有一个独特的.substance文件,包含了图像的特定实例,而.domain和.style文件可以应用到很多不同的图像中。

    现在,你已经准备好开始你的Penrose之旅,制作你的第一个Penrose图像了!在接下来的教程中,我们将会一步步教你如何创建包含两个集合的图像,如何描绘子集的概念,以及如何展示向量的加法。让我们一起来开启这个精彩的旅程吧!

  • Cython并行编程:揭秘Cython并行模块

    欢迎各位读者,我们今天将要探索的主题是Cython的并行编程功能。如果你是一名Python开发者,对于如何提升代码运行效率感兴趣,那么本文定会让你大开眼界。Cython是一个强大的工具,它能让Python代码运行得更快,而且还支持原生的并行化。今天,我们要深入探索的正是Cython 3版本的并行模块。

    Cython并行模块的使用需要明确两种语法:Cython专有的cdef语法和纯Python语法。这两种语法都能让我们在Python代码中使用C数据类型,只需要导入特殊的cython模块即可。值得注意的是,使用纯Python语法时,我们强烈推荐你使用最新的Cython 3版本。

    Cython通过cython.parallel模块支持原生并行化。要使用此类并行化,必须释放GIL(Python全局解释器锁)。目前,Cython支持OpenMP,未来可能会支持更多后端。

    并行循环:cython.parallel.prange()

    Cython提供了一个名为prange的函数,用于并行循环开发。prange函数会自动启动一个线程池,并根据设定的调度策略分配工作。它的使用方式与Python的range函数相似,但是提供了更多功能,包括线程局部变量、变量归约和私有变量。以下是两个简单的例子,一个使用纯Python语法,一个使用Cython语法:

    from cython.parallel import prange
    
    i = cython.declare(cython.int)
    n = cython.declare(cython.int, 30)
    sum = cython.declare(cython.int, 0)
    
    for i in prange(n, nogil=True):
        sum += i
    from cython.parallel import prange
    
    cdef int i
    cdef int n = 30
    cdef int sum = 0
    
    for i in prange(n, nogil=True):
        sum += i

    并行区域:cython.parallel.parallel()

    Cython还提供了parallel指令,它可以用在with语句中,以并行方式执行代码序列。这在设置prange中用于线程局部缓冲区的情况下非常有用。下面的例子展示了如何使用线程局部缓冲区:

    from cython.parallel import parallel, prange
    from cython.cimports.libc.stdlib import abort, malloc, free
    
    @cython.nogil
    @cython.cfunc
    def func(buf: cython.p_int) -> cython.void:
        pass
        # ...
    
    idx = cython.declare(cython.Py_ssize_t)
    i = cython.declare(cython.Py_ssize_t)
    j = cython.declare(cython.Py_ssize_t)
    n = cython.declare(cython.Py_ssize_t, 100)
    local_buf = cython.declare(p_int)
    size = cython.declare(cython.size_t, 10)
    
    with cython.nogil, parallel():
        local_buf: cython.p_int = cython.cast(cython.p_int, malloc(cython.sizeof(cython.int) * size))
        if local_buf is cython.NULL:
            abort()
    
        # populate our local buffer in a sequential loop
        for i in range(size):
            local_buf[i] = i * 2
    
        # share the work using the thread-local buffer(s)
        for j in prange(n, schedule='guided'):
            func(local_buf)
    
        free(local_buf)

    获取线程ID:cython.parallel.threadid()

    Cython并行模块还提供了threadid函数,用于获取当前线程的ID。对于n个线程,ID将从0到n-1。

    编译

    最后,要实# Cython并行编程:揭秘Cython 3.0.5并行模块

    欢迎来到我们今天的故事,我要带你一起探索一个神秘的领域——Cython的并行编程。如果你是Python的忠实粉丝,对如何提升Python代码运行效率的问题抱有热切的兴趣,那么这篇文章一定不会让你失望。接下来,我们要深入探讨的是Cython 3.0.5版本的并行模块。

    首先,我们需要了解Cython提供了两种语法:Cython专有的cdef语法和纯Python语法。这两种语法都能让我们在Python代码中使用C数据类型,只需要导入特殊的cython模块即可。如果你选择使用纯Python语法,强烈推荐你使用最近的Cython 3版本,这样你将会体验到更多的改进和优化。

    Cython通过cython.parallel模块支持原生的并行化。要使用这种并行化,必须释放GIL(Python全局解释器锁)。目前,Cython支持OpenMP,并且未来可能会支持更多的后端。

    轻松实现并行循环:cython.parallel.prange()

    Cython提供了一个名为prange的函数,用于并行循环开发。当你使用prange时,OpenMP会自动启动一个线程池,并按照你设定的调度策略分配工作。这个函数的参数与Python的range函数相似,但提供了更多的功能,包括线程局部变量和归约,以及最后的私有变量。你可以把prange看作是一个更强大、更灵活的range

    并行区域:cython.parallel.parallel()

    除了prange,Cython还提供了parallel函数,它允许你在一个指定的代码块中并行执行多个任务。这在你需要在prange的循环体中使用线程局部缓冲区的场景中特别有用。

    获取线程ID:cython.parallel.threadid()

    在一些情况下,你可能需要知道当前执行的是哪一个线程。Cython并行模块提供了threadid函数,你可以通过它获取当前线程的ID。

    Cython的并行编程功能为Python开发者提供了一个强大的工具,让Python代码能够更好地利用多核处理器的计算能力。这样不仅能提高代码的执行效率,还能在处理大数据或者复杂计算任务时,带来更好的用户体验。

    这就是我们今天要分享的内容,感谢你的阅读,希望这篇文章对你有所帮助。在编程的世界中,我们应该始终保持好奇和热情,不断探索未知,并享受其中的乐趣!

  • 探索Zig:小巧而强大的编程语言

    你是否曾经对一门编程语言深入研究,却发现它的复杂性超出你的预期?你是否寻找过一种编程语言,既强大又灵活,同时又简单易懂?如果你的答案是肯定的,那么,让我来向你介绍一门称为Zig的语言,它可能正是你一直在寻找的那种语言。

    Zig是一种专注于优化和易用性的编程语言。与C++、D和Rust等其他编程语言相比,Zig提供了一种全新的编程体验,让你可以真正专注于编程,而不是花费无尽的时间去理解编程语言本身。

    Zig的主要特点

    简洁易懂

    Zig的语法简洁明了,全语法只有500行PEG文法文件。它没有隐藏的控制流,隐藏的内存分配,也没有预处理器和宏。这意味着如果Zig代码看起来没有跳转去调用一个函数,那么它就不会调用。这种清晰的语法规则极大地提高了代码的可读性和可维护性。

    性能与安全并重

    Zig提供了四种构建模式,你可以在编程时自由选择。这四种模式包括调试,释放安全,释放快速,和释放小。这为开发者提供了一种灵活的方式,可以在需要最大性能的地方禁用安全检查,而在其他地方保持代码的安全性。

    兼容C语言

    Zig不仅可以与C语言库无缝集成,而且还提供了一种编译C代码的方式。这使得Zig在处理跨平台编译时具有极高的效率。

    Zig的优势

    Zig的优势并不仅仅在于其简洁的语法和灵活的构建模式。还包括一些其他的特性,比如:

    • 顶级声明的顺序独立性:Zig的全局变量的初始化值在编译时被计算,无需考虑声明顺序。
    • 空指针的替代方案:Zig使用可选类型代替空指针,有效防止许多运行时异常。
    • 手动内存管理:Zig允许程序员自行管理内存,使其代码可以在各种环境中运行,如桌面应用、低延迟服务器、操作系统内核、嵌入式设备、实时软件等。

    Zig的设计目标是为了让你能尽可能地专注于自己的项目,而不是被编程语言本身的复杂性所困扰。如果你正在寻找一种小而强大,简洁而灵活的编程语言,那么Zig值得你一试。

  • Zig编程语言:强大、简洁,又不失优雅

    大家好,今天我们要来聊聊一个全新的通用编程语言:Zig。这是一款为了维护健壮、优化和可重用软件而设计的工具链。

    Zig的设计理念

    Zig力求简洁明了,让开发者可以将精力集中在调试应用程序上,而不是去理解复杂的语言知识。Zig没有隐藏的控制流,没有隐式的内存分配,也不使用预处理器或宏。这样一来,使用Zig编程,你总是清楚自己在做什么。

    Zig的编译时间 (Comptime)

    Zig引入了一种全新的元编程方式,它基于编译时的代码执行和惰性求值。在Zig中,你可以在编译时调用任何函数,无需担心运行时开销。Zig的编译时间(Comptime)可以模拟目标架构,让你在编程时就能预见到在实际运行环境中的行为。

    Zig的可维护性

    Zig提供了一种优雅的方式来逐步改进你的C/C++/Zig代码库。你可以把Zig当作一个零依赖的C/C++编译器使用,它天生支持跨平台编译。通过zig build,你可以在所有平台上创建一致的开发环境。你甚至可以向C/C++项目中添加Zig编译单元,Zig默认启用了跨语言的链接时间优化。

    Zig社区

    Zig社区是去中心化的,任何人都可以自由地开始并维护自己的社区聚集地。没有所谓的“官方”或“非官方”,不过,每个聚集地都有自己的版主和规则。

    Zig的主要开发工作在GitHub的Zig仓库进行,你可以在那里找到问题跟踪器和提案讨论。我们希望所有的贡献者都能遵守Zig的行为准则。

    Zig软件基金会

    Zig软件基金会(ZSF)是一个于2020年由Zig的创造者Andrew Kelley成立的非营利性公司。基金会的目标是支持Zig语言的发展。目前,ZSF能够以竞争性的待遇为少数核心贡献者提供薪酬。我们希望在未来能够扩大这个优惠,让更多的核心贡献者得到薪酬。ZSF主要靠捐款维持运营。

    Zig的赞助者

    我们的赞助者包括一些公司和个人。他们为Zig提供了直接的财务支持,使得Zig项目可以对开源社区负责,而不是对公司股东负责。我们感谢所有赞助Zig的人,尤其是那些每月捐款200美元或以上的赞助者。

    希望你能从Zig中找到乐趣,让我们一起探索这个新的编程世界!

  • 让PHP在浏览器上翱翔:Sean Morris 的 php-wasm 项目探索

    你是否曾想过在浏览器中直接运行 PHP 代码?Sean Morris 带来的 php-wasm 项目就是为此而生。它将 PHP 引擎与 WebAssembly 结合,让 PHP 开发者能够在新的领域大展身手。这个项目的原始版本由 Oraoto 开发,Sean Morris 则对其进行了 ES6 和 Clang 的升级。让我们一起跟随这个项目的脚步,探索在浏览器中运行 PHP 的全新可能性。

    项目简介:php-wasm

    php-wasm 是一个开源项目,其目标是在浏览器中运行 PHP 代码。项目的主体部分托管在 GitHub 上,采用 Apache-2.0 许可证进行开源。其核心思想是将 PHP 与 WebAssembly 结合,让 PHP 开发者可以更方便地开发前端应用。

    在这里,我们可以看到 php-wasm 项目的主页以及相关的代码,包括了许多文件夹和文件。例如,bin 文件夹中保存的是一些可执行文件,而 dist 文件夹中则保存了项目的构建结果。在项目主页的下方,我们还可以看到项目的 README 文件,其中详细介绍了项目的目标、功能和使用方法。

    php-wasm 的特色与功能

    php-wasm 提供了一套完善的应用解决方案,让开发者可以在浏览器中运行 PHP 代码。项目的最新版本为 v0.0.8,秉承“准备起飞”的精神,带来了一系列新的功能和改进。

    首先,php-wasm 支持 ESM 和 CDN 模块,扩大了项目的适用范围。此外,它还增加了对 stdin 的支持,让开发者可以在 JavaScript 中对 stdout/stderr 进行缓存。同时,它还支持 <script type = "text/php"> 的方式运行 PHP 代码,让开发者可以在页面中直接使用 PHP。此外,php-wasm 还添加了对 iconv 和 html-tidy 的支持,提升了项目的兼容性。

    php-wasm 还具备了一些强大的功能,包括内置的 PHP 和取出输出的能力,以及在 web 和 node 中进行构建的能力。此外,它还提供了一种简洁的方式来打包文件,让开发者可以更方便地管理项目。最后,php-wasm 对 PHP 进行了更新,使其达到了 8.2.11 版本,并使用 Emscripten 3.1.43 进行构建,进一步提升了项目的性能。

    总的来说,php-wasm 项目以其独特的理念和强大的功能,为 PHP 开发者打开了全新的可能,让他们可以在浏览器中运行 PHP 代码,提供了一种全新的开发方式。

    如何使用 php-wasm?

    要使用 php-wasm,首先需要将 php-tags.js 脚本从 CDN 中引入。然后,就可以在页面中直接运行 PHP 代码了。例如,通过 <script type = "text/php"> 的方式,我们可以直接在页面中运行 <?php phpinfo(); ?>。此外,我们还可以通过 data- 属性来使用标准输入、输出和错误,只需将属性值设置为与标签匹配的选择器即可。

    php-wasm 还支持在 <script type = "text/php"> 标签以及其输入元素上使用 src 属性。例如,我们可以在 script 标签中引入一个 PHP 文件,并指定其输入和输出。

    结语

    php-wasm 项目为 PHP 开发者提供了一种全新的工作方式,让他们可以在浏览器中运行 PHP 代码,开拓了新的开发领域。项目的源代码托管在 GitHub 上,开放给全球的开发者,共同推动这个项目的进步。Sean Morris 的努力和创新,不仅让 PHP 开发者得到了更多的可能性,也让我们看到了开源社区的活力和创新。

  • Redis的BLPOP、BRPOPLPUSH 系列指令

    Redis 是一个高性能的键值对存储系统,它支持多种数据结构,包括字符串、列表、哈希、集合、有序集合等。这里我们来介绍一下 Redis 的 BLPOPBRPOPLPUSH 系列命令。

    BLPOP (Blocking Left POP)

    BLPOP 是一个阻塞的列表弹出操作。它是 LPOP 的阻塞版本,可以从列表的最左侧(头部)移除并获取一个元素。如果列表为空或不存在,BLPOP 命令将阻塞连接,直到等待的列表中有可弹出的元素或达到超时时间。其基本用法如下:

    BLPOP key1 key2 ... keyN timeout

    在这里,key1key2keyN 是你想要弹出元素的列表,timeout 是阻塞超时时间(单位是秒)。命令返回的是一个两元素的数组,第一个元素是被弹出元素所在的列表名,第二个元素是被弹出的元素。如果达到超时时间,命令将返回 nil

    BRPOPLPUSH (Blocking Right POP Left PUSH)

    BRPOPLPUSH 命令是 BRPOPLPUSH 的组合。它从一个列表的最右侧(尾部)移除元素,并将该元素添加到另一个列表的最左侧(头部)。如果源列表为空,该命令将阻塞连接,直到源列表中有可弹出的元素或达到超时时间。其基本用法如下:

    BRPOPLPUSH source destination timeout

    在这里,source 是源列表,destination 是目标列表,timeout 是阻塞超时时间(单位是秒)。命令返回的是被弹出并推入目标列表的元素。如果达到超时时间,命令将返回 nil

    BRPOPLPUSH 命令是原子性的,这意味着即便是在多个客户端并发执行这个命令的情况下,也不会有竞态条件(race condition)的发生。这使得 BRPOPLPUSH 非常适合实现可靠的队列——即使在处理过程中发生了错误或者服务器崩溃,你也可以通过目标列表恢复数据。

  • 使用Devilbox简化本地开发:Docker化的PHP堆栈

    Devilbox是一个现代化且高度可定制的PHP开发堆栈,基于Docker运行。它为所有主要操作系统提供可重现和相同的开发环境,无需任何配置。无论您是在开发LAMP还是MEAN堆栈,Devilbox都可以轻松切换和组合所需的版本以供本地开发使用。通过自动创建虚拟主机(vhost)、SSL证书和DNS记录,Devilbox支持无限数量的项目。在本文中,我们将探讨Devilbox的功能以及它如何简化本地开发。

    简单安装和设置:
    安装Devilbox非常简单。只需克隆Devilbox存储库并配置环境文件即可。Devilbox适用于包括Linux、macOS和Windows在内的所有主要操作系统。完成设置后,您可以使用一个命令启动所有容器。

    精确运行所需的内容:
    Devilbox提供了灵活性,可以选择所需的守护程序及其版本。您可以轻松配置Apache、Nginx、PHP、MySQL、MariaDB、Percona、PgSQL、Redis、Memcached、MongoDB等。这样,您可以在开发过程中准确模拟生产环境。

    附加服务和工具:
    除了默认堆栈之外,Devilbox还提供了其他一些可以轻松启用和启动的服务。这些服务包括Python(Flask)、Blackfire、ELK、MailHog、Ngrok、RabbitMQ、Solr、HAProxy、Varnish等等。您可以仅启动所需的容器,并在堆栈运行时添加或删除守护程序。

    邮件拦截和自动DNS:
    Devilbox包含一个内置的postfix邮件服务器,可以拦截所有发出的电子邮件,确保您在开发过程中不会意外发送真实的电子邮件。自动DNS功能会自动为每个项目提供正确的DNS记录,无需手动编辑主机文件。

    用户友好的内部网络和安全性:
    Devilbox配有一个用户友好的内部网络,提供有用的工具,如容器健康监控、DNS状态、可用的虚拟主机、电子邮件、数据库和有效的配置。安全性也是一个重要考虑因素,Devilbox使用官方Docker映像和自定义映像的混合方式。所有集成的容器都可以在GitHub上进行查看。

    始终更新和活跃的社区:
    Devilbox容器经常更新并推送到Docker Hub。您可以轻松拉取最新的映像或重新构建特定的容器以获取最新版本。Devilbox拥有活跃的社区,欢迎贡献、错误报告、功能请求和通过GitHub、论坛和聊天渠道的合作。

    结论:
    Devilbox通过提供可定制和可复现的基于Docker的PHP堆栈简化了本地开发。通过其简单的安装、选择守护程序和版本的灵活性、附加服务和工具、邮件拦截、自动DNS、用户友好的内部网络和活跃的社区支持,Devilbox简化了开发流程,提高了生产效率。无论您是初学者还是经验丰富的开发人员,Devilbox都是创建和管理开发环境的有价值工具。尝试一下,体验轻松的本地开发带来的好处。


    devilbox.org

  • Laradock:简化PHP开发环境的利器

    Laradock 是一个为 Docker 提供的全功能 PHP 开发环境,它支持多种常用服务的快速配置,为 PHP 开发者提供了一个便捷的开发环境。Laradock 的设计初衷是让开发者能够快速切换不同版本的 PHP、选择自己喜欢的数据库引擎,并且可以轻松运行各种常用的服务。

    Laradock 的特点如下:

    1. 轻松切换 PHP 版本:支持 PHP 8.1、8.0、7.4、7.3、7.2、7.1、5.6 等多个版本。
    2. 多种数据库引擎:支持 MySQL、Postgres、MariaDB 等常用数据库引擎。
    3. 自定义开发栈:支持 Memcached、HHVM、RabbitMQ 等各种常用服务。
    4. 每个软件运行在独立的容器中:PHP-FPM、NGINX、PHP-CLI 等软件都在自己的容器中运行。
    5. 容器定制化简单:可以通过简单地编辑 Dockerfile 来自定义任何容器。
    6. 基于官方基础镜像:所有镜像都是基于官方的基础镜像构建的,安全可靠。
    7. 预配置的 NGINX:预配置 NGINX 以托管根目录下的任何代码。
    8. 支持单个项目或多个项目:可以为每个项目单独使用 Laradock,也可以为所有项目共用一个 Laradock。
    9. 通过环境变量轻松安装/移除容器中的软件。
    10. 清晰、结构良好的 Dockerfile。
    11. 最新版本的 Docker Compose 文件。
    12. 所有内容可见且可编辑。
    13. 快速构建镜像。

    快速入门:
    让我们看看如何轻松设置我们的演示堆栈:PHP、NGINX、MySQL、Redis 和 Composer。

    1. 在你的 PHP 项目中克隆 Laradock:
    git clone https://github.com/Laradock/laradock.git
    1. 进入 laradock 文件夹,将 .env.example 重命名为 .env:
    cd laradock
    mv .env.example .env
    1. 运行容器:
    docker-compose up -d nginx mysql phpmyadmin redis workspace
    1. 打开项目的 .env 文件,并设置以下内容:
    DB_HOST=mysql
    REDIS_HOST=redis
    QUEUE_HOST=beanstalkd
    1. 在浏览器中访问 localhost:http://localhost。就是这样,尽情享受吧!

    Laradock 支持的服务:
    Laradock 遵循关注点分离原则,因此它将每个软件运行在自己的 Docker 容器中。你可以根据需要启动/关闭任意数量的实例,而不必担心配置的问题。要运行下面列表中的容器,请使用 docker-compose up -d {container-name} 命令。

    Web 服务器:

    • NGINX
    • Apache2
    • Caddy

    负载均衡器:

    • HAProxy
    • Traefik

    PHP 编译器:

    • PHP FPM
    • HHVM

    数据库管理系统:

    • MySQL
    • PostgreSQL
    • PostGIS
    • MariaDB
    • Percona
    • MSSQL
    • MongoDB
    • MongoDB Web UI
    • Neo4j
    • CouchDB
    • RethinkDB
    • Cassandra

    数据库管理应用:

    • PhpMyAdmin
    • Adminer
    • PgAdmin

    缓存引擎:

    • Redis
    • Redis Web UI
    • Redis Cluster
    • Memcached
    • Aerospike
    • Varnish

    消息代理:

    • RabbitMQ
    • RabbitMQ Admin Console
    • Beanstalkd
    • Beanstalkd Admin Console
      Eclipse Mosquitto

    laradock

    laradock/README-zh.md at master · laradock/laradock (github.com)

人生梦想 - 关注前沿的计算机技术 acejoy.com