PHPNW12:回顾

一年一度的 PHPNW 大会一年比一年好,今年也不例外。自 2008 年 PHPNW 会议成立以来,我一直在参加它们,今年我有幸参与了一些会前组织和活动的帮助。

当论文征集于 6 月结束时,我花了一个周末时间阅读演讲者的摘要和简历,试图将 169 次演讲提交减少到 32 次左右。然后我与 Jeremy Coates、Rick Ogden 和 Jenny Wong 坐下来选择哪些演讲将包含在最终选择中。会议结束后,我坐下来开始制定博客时间表,并写了一些博客文章来引起人们的注意。

辅导日

会议召开前几周,我感到惊喜,因为我在其中一个辅导日获得了一个免费席位,前提是房间内有空余座位。辅导日在不列颠尼亚酒店举行,就在周六举行主要会议的美居酒店对面。我选择参加 Lorna Mitchell 为期一天的关于 PHP 交易工具的会议。当我那天出现时,我跑了一些差事并帮助我买票,然后才能加入教程,这是在第一次休息之后。我错过的是人们设置 Github 帐户并安装,joind.in以便他们可以使用可重用的 PHP 工具对其进行分析,但我很快就掌握了速度。

joind.in,如果您还没有听说过,它是一个开源项目,允许人们评论和评价他们去过的演讲。这是告诉演讲者他们哪里做对或哪里出错的好方法,这样他们就可以改进他们的演讲。我将使用该网站输入我在 PHPNW12 上看到的演讲的评分。

当天剩下的时间包括使用 PhpDocumentor、PHPCodeSniffer、XHProf 和 Phing 等工具以及joind.in源代码来查看需要做什么。尽管我过去曾见过其中一些工具,它们都集中在一个地方,并且提供了有关如何使用它们的上下文对我来说真的很有用。令我印象深刻的是,那场会议中的许多人都没有 Github 帐户,也根本没有为开源项目做出贡献,到一天结束时,他们将代码贡献回了joind.in代码库,Lorna 就在那里合并了代码库,然后.

Lorna 是一位能干且知识渊博的沟通者,我今天确实收获了很多。它实际上让我意识到我知道的比我想象的要多得多,我只需要将我的知识付诸实践。我想我从那天带回家的信息是知识是一回事,但有信心将这些知识付诸实践是另一回事。我不仅学到了很多关于 PHP 工具的知识,还学到了我自己的能力。

一天结束后,我帮助把所有东西都搬到楼下参加黑客马拉松活动,不幸的是我无法参加。于是我踏上了回家的路,迫不及待地想玩玩我白天学到的所有工具。

周六

我周六早上的第一个职责是确保人们在走进会议时带好挂绳。我是站在以新西兰结尾的姓氏的办公桌前的人之一。我们很快就通过了每个人,很快就到了主要会议主题演讲的时间。

主题演讲:开发人员体验、API 设计和工艺技能
Ade Oshineye

Ade 是一名开发人员,多年来从事过多个 Google 项目,并且在如何打造出色的 API 方面拥有丰富的经验。任何使用您编写的代码的人都是 API 用户,这使我们大多数 API 设计师成为可能。构建 API 的问题在于它不需要事先研究,人们通常会将一些东西放在一起并希望得到最好的结果。这与打造 UX 体验形成鲜明对比,后者需要研究、测试和证明它是有效的。

正是出于这个原因,Ade 和其他一些人建立了该网站,developerexperience.org以尝试整理有关如何创建 API 的最佳信息。

Ade 在 Google 工作了很多年,在这段时间里,他意识到一旦 API 构建好,让人们首先使用它是很重要的。在创建 gmail 时,开发人员引入了标签而不是文件夹的概念。经过几年的人们询问文件夹并被告知标签,他们最终意识到用户是正确的,并且他们将文件夹构建到 gmail 中。

当 Google 创建 OAuth API 时也看到了同样的事情。他们发现他们一遍又一遍地回答相同的 6 个问题,而不是记录需要发生的事情,他们决定将这些常见问题写出 API。

API 功能强大,但由于其复杂性,通常难以使用。事实证明,德国人对此有一个概念,称为 Zuhanden(准备上手)和 Vorhanded(手头上)。使用 Zuhanded,您可以专注于您想做的事情,而不是您想使用的工具。使用 Vorhanden,工具变得比您尝试做的事情更重要,API 通常就是这种情况。您应该考虑 API 的使用方式,使它们易于使用,使开发人员更容易使用它。

一个现实生活中的 API 示例,它不适合使用 git,因为它需要了解内部结构才能使其工作。另一方面,Mercurial 是一个更好的 API,因为它可以满足您的期望。

Ade 谈到了 Richard Sennett 和“修理技能”(在 The Craftsman 一书中),该书提出了“成为一名熟练工人意味着什么?”的问题。要想修复,首先要了解它,修复的方法有两种。静态修复是修复某些东西以使其达到预期效果的最简单方法。动态修复是您更改工具以解决问题的地方。例如,螺丝刀作为锤子非常有用,但是当螺丝刀坏了时,您只需用锤子更换螺丝刀即可。

python feedparser 是一个广泛使用的 RSS 解析系统,它能够解析甚至写得很糟糕的 RSS 提要。Ade 发现自己需要它并接手了该项目的开发工作。当他宣布放弃对旧版本 python 的支持时,人们站出来抱怨。由于这是一个资源有限的开源项目,他为人们提供了从事遗留支持工作的机会,因为他没有时间去做。

从这次谈话中得到的信息是,我们应该在星期一回去工作,并改变一些东西以使其更好。想想使用界面的人并改变它以使他们的生活更美好。

我非常喜欢这次谈话。Ade 是一个有趣的角色,他能够在枯燥的 API 设计世界中找到幽默感。他确实在设计原则方面做了功课,并且能够谈论像 Richard Sennett 和 Dieter Rams 这样的人,以及他如何应用他们在开发 API 技术时谈到的原则。一个非常有趣的谈话,带有一些好的带回家的信息。

您将实际使用的 PHP 5.4 功能
Lorna Mitchell

这是对 PHP 5.4 中的一些实际有用的功能的介绍。Lorna 在开始时表示,这是对 PHP 5.4 最佳部分的完全主观选择。

新的数组创建语法
新的数组语法本质上意味着您可以像在 JavaScript 中一样定义数组。

$game = ['scis', 'stone', 'paper']

$game = [0 => 'scis', 1 => 'stone', 2 => 'paper'];

数组解引用
这是一种访问由函数返回的数组内容的方法。这是一个非常好的技巧,但不是最佳实践的高度,因为它不允许数组为空。

function getlist() {

  return ['Grumpy', 'Sleepy];

}

$item = getlist()[0];

echo $item; //Grumpy

速度
PHP 5.4 中的内存管理和垃圾收集已得到改进,因此它比以前的版本更快。为了测试这一点bench.php,在 PHP 源代码中调用了一个脚本,可用于对 PHP 构建进行基准测试。这个基准脚本运行了一系列函数,在 5.1 中运行需要 4 秒,在 5.4 中运行只需 2 秒。

特质
特质是一组可重用的方法,看起来像一个类,但类声明以“特质”而不是“类”开头。当您想在其他类中使用 trait 时,您可以使用 'use' 关键字将其包含在内。一个很好的用途是在多个类中包含日志功能或类似功能,而不必创建多个级别的无用层次结构。

trait Audit {

  function somemethod(){

    return 0;

  }

}

 

class Otherclass {

  use Audit;

}

 

$object = new Otherclass();

$object->somemethod();

也可以在其他特征中使用特征,从而创建特征层次结构。

内置 Web 服务器
PHP 5.4 现在有一个简单、轻量级的 HTTP 服务器,应该只用于开发。Lorna 非常肯定地将这一点带回家,因为简单的服务器应该只用于简单的调试目的,而不要用于生产。主要问题是请求是按顺序提供的,这意味着任何需要几秒钟处理的请求都必须完成,然后才能填充任何新请求。

Lorna 说,这是她不知道自己需要的功能。起初对这个功能持怀疑态度,现在她离不开它。要启动并运行服务器,您可以使用 -S(大写 s)作为命令行标志并指示要使用的地址和端口。这将从index.php您运行此脚本的目录中获取文件。

php -S localhost:8080

也可以设置域名,只要在hosts文件中设置地址即可。这种方法的结果是,如果其他人以相同的方式编辑他们的主机文件,他们也可以查看您机器上的网络服务器。

php -S wibble.local:8080

您还可以使用 -t 标志指定文档根目录。如果您不想从运行脚本的目录提供文件,则使用此选项。

php -S localhost:8080 -t /var/www/project

您还php.ini可以使用 -c 标志指定应将哪个文件用于服务器。

php -S localhost:8080 -c php.ini-development

也可以使用路由文件,它改变了index.php在当前目录中查找文件的默认行为。

php -S localhost:8080 routing.php

会话上传进度
文件上传进度以前只能通过使用 PECL 上传进度库来实现。PHP 5.4 具有内置的会话上传进度功能,该功能完全相同。这可以与新的 HTML5 进度条配对以创建文件上传脚本。此功能不能与 PHP 5.4 Web 服务器一起使用,因为它通过在一个进程中上传文件然后生成另一个进程来检查进度来工作。由于 PHP 5.4 网络服务器一次只能处理一个请求,因此您将无法正确测试此功能。

JsonSerializable
类现在可以实现 JsonSerializable 并使用一种jsonSerialize()方法将类呈现为 JSON 对象。该jsonSerialize()方法只需要返回一个数组,该数组将包含要打印为 JSON 的数据。这对于曾经尝试将类转换为 JSON 的任何人都非常有用,这通常是一个耗时的过程,并且通常需要第三方代码才能轻松完成。

然后,Lorna 快速查看了一些从 PHP 中删除的废话。这些是诸如 register_globals、register_long_arrays、y2k_compliance 和 ereg* 函数之类的东西。我对其中任何一个都没有问题,但我确实看到魔术引号也将被删除。这与我无关,因为我已经制定了永远不要依赖系统上存在的魔术引号的规则,但我认为有些人可能会觉得这很烦人。

总的来说,这是对我听说过的 PHP 5.4 中的一些新东西的一个很好的介绍,但还没有机会看到。PHP 5.4 将在 Ubuntu 的下一个主要版本中可用(几周后),因此这些功能很快就会被使用。我肯定会利用网络服务器功能来运行快速测试,而不必摆弄 Apache 配置文件。

React:事件驱动的 PHP
Igor Wiedler

React 是一个非阻塞 I/O 库,相当于 PHP node.js,Igor 是参与该项目的人之一。Node.js是一种将不同的网络库连接到一个连贯层(包括 Windows 支持)的技术。然后,Google V8 JavaScript 引擎提供了一个接口来处理这个低级库。JavaScript 的使用使这种连接变得易于使用,从而变得node.js如此流行。Igor 表示他想知道为什么node.js如此受欢迎,因为 React 是不依赖任何外部库的同一个东西。他还对 JavaScript 发表了一些评论,这在 Twitter 上引起了一些关注。

“PHP 和 JavaScript 社区之间的区别在于 PHP 人*知道*他们的语言是狗屎。”

Igor 说 PHP 社区是由盗版者组成的,当我们看到一个好主意时我们会复制它,尽管这是值得骄傲的事情。

React 创建了所谓的事件循环,在其中控制和处理流。它是一个库而不是一个框架,所以没有为您提供任何东西,一切都必须构建。它是通过 composer 包管理器安装的,这使得它非常容易,因为 React 有许多不同的组件。Igor 还负责 Composer 的工作,并表示它是现有最先进的依赖管理器。

React 的理念是它应该是开箱即用的,不需要比 PHP 额外的组件。这个想法也是为了证明世界是错误的,非阻塞 I/O 在 PHP 中是完全可能的。事件循环是唯一阻塞的部分,因此两个循环不能同时存在。React 制作了这个单一的事件循环,并将其作为事件循环组件提供给其他系统使用。React 由 HTTP、Socket、Streams 和 EventLoop 层组成。

对任何框架的真正测试是用户端实现,而 React 已经有一些。一个例子是 React/WHOIS,它是 React 中 WHOIS 协议的一种实现。通过使用它来创建 Wisdom,一个域名检查器,这已经得到了进一步的发展。最显着的例子是 Ratchet,它是一个 websocket 服务器,并且是如何使用 React 做出有用的东西的第一个例子之一。Igor 提到的一件事是不要对数据做任何事情,非阻塞系统应该被用作资源而不是一种保存数据的方式。

总的来说,这次会议在更复杂的部分中让我失去了几次。不过我并不太担心,因为我对技术背后的想法印象深刻,并且正在做笔记以便事后查找。Igor 的信息是 PHP 可以像其他语言一样迷人,没有什么是我们不能窃取的,而且 PHP 可以不仅仅是另一种脚本语言。


Jakub Zalas 中的Symfony 组件

Symfony 组件是 Symfony 框架的一部分,它允许您解决某些任务而无需从头开始编写代码。编写更少的代码意味着引入更少的错误,这总是一件值得努力的事情。有相当多的 Symfony 组件可以提供各种功能,Jakub 选择了一些他最喜欢的组件来演示。

微框架 Silex 是一个很好的工作框架示例,它将 Symfony 组件打包到一个连贯的结构中。

HttpFoundation 是一个面向请求/响应的解决方案,它包含了很多不同的东西,这些东西在满足 HTTP 请求时常用。像检查安全连接这样简单的事情都内置在组件中。路由是决定页面请求期间发生的事情的重要部分,路由组件提供此功能。EventDispatcher 提供了抛出或监听各种事件的能力。您可以以不同的方式收听事件并根据需要对其做出反应。HttpKernel 组件将 EventDispatcher、Routing 和 HttpFoundation 组件联系在一起。

控制台是一种创建没有 Web 前端的脚本的方法。它本质上是一种从命令行获取输入以提供输出的方式。您可以使用configure()和execute()方法扩展命令行参数。

要开始使用 Symfony 组件,您需要使用 composer。这是一个依赖管理器,可以从一组简单的指令中下载所需的依赖。这可能是获取您正在创建的应用程序所需的组件的最方便的方法。

出于多种原因,使用 Symfony 是一个不错的选择。源代码由单元测试覆盖,并已通过完整的安全审计独立验证。API 稳定且灵活。Symfony 及其组件在行业中得到广泛采用,因此您在使用它时学到的任何技能都可以转移到其他系统。它周围还有一个很棒的社区,负责推动创新并制作像 Twig 和 Composer 这样的东西,它们是解决实际问题的好方法。

这个演讲很有趣,我学到了更多关于我最有可能在 Drupal 8 中使用的组件的知识。虽然一开始很紧张,但 Jakob 安顿下来并成功地进行了一场精彩的演讲。

有效的代码审查
Sebastian Merek

塞巴斯蒂安首先介绍了一系列基于愤怒的小鸟的编程相关角色,称为愤怒的书呆子。通过这些字符,他展示了一些围绕代码审查主题的场景。

Sebastian 给出的第一条建议是不要使用电子邮件,因为这会导致延迟并且无法追踪。必须使用错误跟踪系统来查看是谁提出的以及何时提出的,以便将其分配给某人。这还允许为代码审查所花费的时间分配一个值。

有一些代码审查工具可用,例如 Crucible、Fisheye Gerrit 和 Github,允许多个开发人员查看和审查代码。这些工具通常都非常好,但在使用它们之前,重要的是要考虑正在审查的内容以及代码的目的是什么。

在提交评论时,有一些事情要避免,但声明诸如“它有效”或语法正确之类的东西并没有真正的帮助。要做的第一件事(在完成审查之前)是使用 lint 和 PHPCodeSniffer 等工具检查代码。对代码进行单元测试很好,但是您需要检查测试以及代码,在不进行任何断言的情况下运行测试是没有意义的。其他工具如 PHP 依赖和 PHP 混乱检测器可以查看代码质量和代码复杂性。

这些都可以组合成一个名为 Sonar 的工具。Sonar 是一个静态分析和代码质量服务器,这样的事情不需要在代码审查中进行计划。你可以看看信息辐射器。有了这个,您就可以查看代码质量、代码设计以及解决方案是否真正解决了问题。

代码审查有利于知识共享、让新手跟上进度并培养集体代码所有权。开发人员在犯错时应该理解并接受代码不是开发人员。重要的是不要在未经咨询的情况下重写代码,因为更改内容可能会破坏您不知道的代码其他区域的内容。

当代码审查者查看代码时,重要的是真正的权威来自知识,而不是来自职位。经理不应该参与代码审查,因为他们不像高级开发人员那样熟练。使用专家审查代码,但始终确保您对解决方案提出质疑,即使该解决方案是由高级开发人员创建的。Sebastian 给我们讲了一个故事,他写了一些有效的代码,但很粗制滥造,代码审查员批准了,因为他们认为 Sebastian 知道他在做什么。

当谈论代码中的错误时,不要使用“你”这样的词,因为这会引起指责,而要使用“它”这样的词,因为这会谈论代码。

这是对代码审查以及如何进行审查的一个很好的介绍。Sebastian 快速演示了 Sonar,它看起来比我认为的更好。它的自动化代码分析看起来是跟踪多个开发人员和多个产品的代码质量的好方法。

Twig 不会让模板化你的敌人!
雨果哈蒙

PHP 本身并不是一个好的模板引擎。它没有分离逻辑和标记,没有手动转义,也没有将模板与核心程序隔离。此外,为了拥有组件,您必须在模板中放置包含,这很混乱。使用模板引擎可以解决所有这些问题,并可以轻松防止跨站点脚本攻击。更重要的是,它允许网页设计师在设计上工作,而开发人员则在后台代码上工作。

有很多现有的 PHP 模板引擎,在构建 Twig 之前,我们进行了分析以查看它们是否可以适应。他们都以不同的方式解决问题,但主要问题是有些没有编译,有些仍然在 HTML 标记中嵌入了 PHP。

要安装 Twig,请使用 Composer。有一个 PEAR 库可用,但 composer 是最好的方法。还可以安装 phpize 扩展来帮助实现 Twig 功能的某些方面。要引导 Twig,您只需要包含autoload.php来自 Composer的文件并创建一个 Twig 对象。

Twig 有一个漂亮而简洁的模板语法,由 3 种标记类型组成,用于注释代码、执行操作或打印操作。

{# comment something #}

{% do something %}

{{ print something }}

当您运行 Twig 模板时,它会将您的模板编译为 PHP。结果是一个带有散列名称的 PHP 类,该类将在下次使用该模板时运行。

Twig 带有调试功能,这是许多模板引擎所没有的,这可以通过调试变量来完成,但也可以使用其他方法。它还具有合理的错误消息,试图猜测问题可能是什么。还有一个严格的变量设置,如果变量不存在则抛出异常。

Twig 能够自动转义输出,并通过htmlspecialchars()PHP 函数完成此操作。还可以使用其他一些转义策略,可以通过使用管道字符后跟转义机制来强制执行这些策略。要停止任何转义,请使用“ raw ”。

{{ name|raw }}

可以强制转义使用' e '或' escape '。

{{ name|e }} {{ name|escape }}

你也可以像 CSS 这样的策略来逃避,它会用样式表标签包围输出。

{{ name|e('css') }}

您还可以使用自动转义块在一个块中自动转义大量输出。

{% autoescape %}{% endautoescape %}

Twig 有很好的打印变量策略。例如,以下代码将打印出一篇文章的标题。

{{article.title}}

标题可以是数组的键、对象的属性,甚至是方法,但也可以使用其他方法。由于这可能是一项非常昂贵的操作,phpize 扩展将以更快的方式提供此功能。

过滤器允许对内容进行格式化,并以与转义函数相同的方式使用。以下是格式化某些文本项的一些示例。

{{ post.published|date('d/m/y') }}

{{ post.title|lower }}

{{ post.title|upper }}

过滤器可以通过管道传输,以便将一个过滤器的输出链接到另一个过滤器。

{{ post.tags|sort|join(', ') }}

Twig 能够使用简单的语法来修剪空格。要修剪输出左侧的空格,请使用以下命令:

{{- name }}

相反,要修剪输出右侧的空格,请使用以下内容:

{{ name -}}

Twig 函数可以独立于引擎本身运行。可以在不渲染模板的情况下编译和标记模板。也可以以各种方式重新配置 Twig,甚至通过配置 Twig_lexer 使用不同的诱人标签(例如 {{ }})。可以通过扩展向 Twig 添加功能,其中一些包含在 Twig 中以提供一些默认选项。自己动手很容易,Hugo 展示了几个例子来说明这是如何实现的。

Twig 通过为 Symfony 1 和 Zend Framework 构建的扩展而被广泛采用。它已经内置在 Symfony 2 中,不需要额外的插件。Drupal 7 的一个扩展可用,它将成为 Drupal 8 中的默认模板引擎。Twig 是使用 PHP 5.2 作为代码库构建的,以使其广泛兼容。

Hugo 一开始就表示,这是针对 Web 开发人员和设计人员的谈话,我同意这一点。它有足够的技术元素让开发人员对事物感到兴奋,还有足够的 HTML 语法让设计人员了解他们将如何在日常工作中使用 Twig。随着 Twig 与 Drupal 的全面集成即将到来,我发现这篇演讲很好地介绍了这个诱人的引擎。

闭幕式

剩下的就是把大家聚集在一起,颁发一些奖品,并感谢所有赞助商、演讲者和帮助者的贡献。由于 UKFast 是白金赞助商,因此他们有机会向人们展示他们的全部内容,并颁发一些他们自己组织的奖品。当我被叫到前台接受一对 PHPNW12 袖扣以帮助我在会议前处理事情时,我感到很惊讶。

这标志着周六会议的结束,所以我借此机会入住酒店并放下我的东西,然后再回到会议上吃晚饭。我住在前一天举办辅导日的不列颠尼亚酒店。虽然会议套房在不列颠尼亚很好,但我住的房间非常简陋。实际上并不脏,但维护得不是很好。我不会推荐任何人真正住在那里。

晚饭后,我们举行了 PHPNW 会议派对,那里有足够多的免费饮料供大家享用。我花了几个小时与会议的其他人在 Wii 上聊天、喝酒和玩耍。美好的一天以非常有趣的方式结束,但还有另一天。

星期日

周日的会议开始时很安静,可能是因为前一天晚上很多人睡觉的时间很晚。简单介绍后,我们开始了第一节课。

使用 PHP 和响应式设计进行扩展和适应:我们如何构建 BBC 新闻
约翰克利夫利的故事

John 传达的第一条信息是,创建一个完全响应式的网站设计是一项艰巨的工作。必须花费大量时间来确保所有设备和所有分辨率都能正常工作。

过去在 BBC 新闻网站上有两个独立的开发流,即 www 和移动版本。这是因为事情很简单,你要么想要桌面版,要么想要移动版。最近,具有不同屏幕尺寸、分辨率和带宽的设备数量激增。这意味着移动网络并没有真正的意义,它更多的是关于跨不同平台的连贯使用。

问题在于,使用 BBC 新闻网站时,他们必须向使用台式机和宽带连接的人提供内容,但也向使用旧移动电话但根本没有太多连接的人提供内容。目前智能手机的销量为 9.53 亿部,但普通手机的销量为 61 亿部,因此对于国际受众,您必须考虑到这一差异。问题是很多网站都没有,一个例子是奥巴马的竞选网站,下载量为 2.5 兆(包括所有图片和文件),没有移动网站。

速度是良好用户体验的关键,BBC 新闻网站的目标是让网站在 10 秒内通过 GPRS 加载,这相当于大约 60-100 KB 的数据。响应式设计有很多肮脏的小秘密,它们会增加页面大小,比如保持相同的图像大小、javascript 库。仅 Facebook 点赞按钮就会使页面大小增加 100KB。

为了构建 BBC 新闻站点的新设计,他们混合使用了浏览器和服务器端检测。有了这些信息,您就可以向正确的平台提供正确的内容。这里的重要部分是考虑实际内容是什么,然后将其提供给移动版本,扩展到更大的带宽和设备。BBC 有很多人试图将内容放到页面上,但本质上,新闻故事应该在那里。

新闻网站所做的是将内容和功能分为两种类型。对台式机和智能手机有利,对旧手机不利。本质上,坏的获得核心体验,也就是内容。

BBC 的开发人员决定创建一个 JavaScript 检查来测试设备是否可以工作。这个测试被称为“切芥末”,只是对某些事情的简单检查,以确保它们会起作用。如果一切正常,那么设备就足够了,并且可以运行基本的站点功能。许多移动设备根本没有 JavaScript 功能,或者渲染元素的速度非常慢,因此不能依靠它来做很多事情,如果有的话。

当事情变得响应时,CSS 会变得有点头脑,有多个媒体查询试图以不同的方式设置相同元素的样式。为了使事情易于管理,他们使用了 SASS。这意味着很多 CSS 是自动生成的。

一旦页面的内容就位,很多不同的东西都会在幕后延迟加载。他们知道要加载哪些部分,因为他们会仔细观察用户正在做什么以了解最常点击的元素是什么。这意味着他们可以将它们预加载到页面上,从而在单击它们时节省时间。

由于 BBC 是一个公共资助机构,预算很少,他们需要尽其所能使用服务器。BBC 新闻网站拥有大量用户,却很少花钱去做昂贵的事情。本质上,所有内容都使用 Varnish 进行缓存,即使是 JSON 回调之类的内容。Varnish 服务器也进行负载平衡以分散提供内容的负载。Varnish 具有上下文感知能力,它知道您在哪里、您拥有什么设备以及您需要的任何 cookie,这使其成为本网站的理想工具。重要的是要注意命中/未命中率,以便 Varnish 缓存得到更多的服务。

当事情变得疯狂时(比如 8000 万用户),然后使用 CDN 来保护事物。在这种情况下,Varnish 上下文丢失了,但这意味着该站点仍然可以得到服务。

测试所有这些几乎是不可能的任务,涉及手动测试 20 台设备、用于自动测试、沙盒测试和远程调试的 selenium 和 Cucumber。一个名为 Weiner 的工具也用于检查移动设备上的页面。某些设备,例如 Blackberry(特别是 5)和 Symbian 确实很难始终如一地工作。Android 很难测试,因为它分散在多个版本中。iOS 总体上还不错,但它开始出现碎片化,旧设备仍然与新设备一起使用。

约翰的演讲在创建移动友好的设计以及测试一切的背后技术方面提供了丰富的信息。他和他的团队显然花了很多时间来解决这个问题,因为他讲述了一些他们有但并不完全奏效的想法的故事。我带着很多关于创建移动网站的想法和建议结束了这次演讲。

到 SQL 或No(t)SQL
Jeroen van Dijk

abc-总是缓存

关系数据库管理系统经过实战测试和标准。它们具有良好的垂直或水平可扩展性,但容易出现架构更改问题。Brewers CAP 定理指出,系统可以具有一致性、可用性和分区容错性,而数据库(甚至是 NoSQL 的)一次只允许其中两个特性。

在他的研究中,Jeroen 发现了 4 种基本类型的 NoSQL 数据库,它们是键值、列、图和文档。

像 redis 或 couchbase 这样的键值数据库本质上是一种无模式设计,它存储带有键引用的数据字符串。它可能很难查询,但由于它主要存在于内存中,因此查询速度可能非常快。它的作用很像 memcache,可以很好地替代使用 memcache 系统。

Cassandra、Riak、Voldermort 和 hbase 等列数据库使用 bigtable 或 dynamo 样式格式。它们依赖于一致的散列并使用基于环的分区系统来存储数据。

像 Sones 或 neo4j 这样的图数据库在关系比实体更重要的系统上工作。这适用于用户以某种方式链接在一起的社交媒体风格数据集。neo4j 具有自定义查询语言,这使得查询变得更加困难。

CouchDB 或 MongoDB 等文档数据库系统与传统 RDMS 最相似,甚至具有熟悉的查询语言。就流行度而言,MongoDB 可能是 NoSQL 世界中的 MySQL。它还具有使用地理索引的能力,由fore square 使用。

最重要的是,这些系统不是传统数据库系统的替代品,只是数据管理生态系统的补充。它们有它们的用途,但没有必要仅仅因为您认为它们可能是一个好主意就放弃您的传统 SQL 系统而支持它们。

Jeroen 承认他实际上还没有在生产中使用它们中的任何一个,但他已经完成了研究以了解更多关于它们的信息。他希望他很快就能在一个项目中使用它们。总的来说,这次谈话内容丰富,结构合理。他甚至详细介绍了如何使用这些系统存储数据以及如何从中获取数据,这对于想要更多了解其工作方式的人来说是理想的选择。网站 nosql-database.org 是了解更多关于 NoSQL 数据库的好资源。

叉它!PHP 中的并行处理
Nathaniel McHugh

Natheniel 首先讲述了他如何尝试准备意大利面的故事,而限制因素是等待水壶中的水沸腾。他谈到他如何将水分离到不同的水壶中,从而节省时间,并引入了并行处理的概念来加快速度。前排有人指出,他可以将意大利面放入水壶中,而不是之后将其转移到锅中,从而可以节省更多时间。

“把意大利面放进水壶里,没想到……”

PHP 没有报告的一件事是系统上有多少处理器可用,因此 Natheniel 自己制作了一个。这部分是作为一个关于如何创建扩展的实验,但也是为了生成一些有用的东西。他创建的扩展添加了函数num_processors_available()and num_processors_configured(),这显然是不同的。

PHP 没有多线程支持,除了单个 PECL 扩展。PCNTL 函数用于派生 PHP 进程,但它们仅适用于 Unix 系统,并且仅适用于 CLI。Web 服务器具有不同的多处理模型,因此 PCNTL 函数不会做太多事情,因为线程是在后台处理的。

分叉的进程有父进程并且可以分叉自己的子进程。但这有时可能是一个坏主意,因为它会使 PHP 很难被杀死。在这种情况下,您可能希望创建一个守护进程来运行该进程并将其与终端分离。网站pctnl_fork()上的函数示例就是一个很好的例子php.net。杀死其父进程的子进程称为孤儿进程。僵尸进程是已死但尚未被主机操作系统清除的进程。

“僵尸是你分叉然后死去的孩子。不过恶魔更喜欢孤儿”

当分叉进程时,资源冲突很容易发生,尤其是在多个孩子和父母的情况下。诸如数据库连接和文件之类的东西可以由孩子打开,这使得父母无法掌握它们。对此的解决方案是让子进程做一些事情,然后将数据传递给父进程,然后父进程会处理一切。诸如临时文件、内存缓存或套接字之类的东西可用于将数据从子级传输到父级。父母在这里的工作是合并孩子的结果。

为了在 PHP 中正确扩展,您需要使用像 gearman 这样的东西,它可以用来将作业发送到可能在多台机器上运行的正确进程。这些解决方案无需任何命令行程序即可使用。

没有自动采用算法并使其并行的方法,这是一个非常困难的问题。对于如何有效地分配工作的问题,没有简单的答案。您还需要确保最后需要合并在一起的数据量很小。也没有办法有效地组织依赖关系。

纳撒尼尔决定尝试让一些事情平行。他尝试的第一件事是采用 phploc(PHP 代码行工具)并创建一个并行版本。这将处理 PHP 项目的时间从 7 秒加快到 5 秒。Nathaniel 说它非常具有实验性,不建议使用它。他还尝试在 Mandelbrot 集生成上使用并行处理。这是一个非常容易并行的系统示例。此时我意识到我从 Nathaniel 的 github 个人资料中认出了他,他有一个在 PHP 中查看分形的存储库。很遗憾他没时间了,因为我希望听到更多关于并行处理分形的信息。

这次会议总体上很好,但 Nathaniel 在一些更复杂的部分让我失望了。我想我将不得不查看 PCNTL 扩展并尝试自己解决问题,但至少我知道从哪里开始寻找。总体而言,他对使用并行处理来加快速度的好处持现实态度,并表示在大多数情况下,您应该只使用像 gearman 这样的基于队列的系统来处理单独任务的处理。这解决了使 PHP 并行化时固有的许多问题。

主题演讲 - 社区也适用于企业!
米开朗基罗·范·达姆

会议的最后一场会议是关于企业如何参与开源技术。这类似于 Michelangelo 在 PHPNW10 上发表的关于参与开源社区的演讲,但对业务参与有所不同。这是一个鼓舞人心的演讲,指出使用开源软件的公司应该向项目回馈一些东西。向开源项目捐赠东西的方式有很多种,金钱只是其中之一。许多项目需要开发人员的时间来帮助修复错误或新功能,甚至只是服务器空间来帮助托管事物。

米开朗基罗擅长传达社区参与的信息,公司可以使用许多想法来参与。他擅长获得参与这样一个社区所带来的温暖模糊的感觉。

在最后一次会议之后,我们有几句结束语,并感谢 Jeremy Coates 和 Rick Ogden,然后我们都去了不列颠尼亚酒店享用烤午餐,以庆祝另一次成功的会议。PHPNW12 是一个伟大的事件,甚至可能是迄今为止最好的 PHPNW 会议。我只想感谢所有参与的人使活动如此成功,我为能参与其中感到自豪。我唯一的遗憾是我无法参加今年(再次)的任何非会议会谈,但据我所知,他们的会谈也都非常好。

我发现的一件事是,在 PHPNW 的这些年里,Composer 被提到了很多,我不记得去年有人提到过它。这可能是正在讨论的项目的副产品,但我认为 Composer 绝对值得参与。如果您还没有听说过 Composer,那么请看一看。

最后,感谢@akrabat 和@stuartherbert 拍摄了这里看到的一些很棒的照片。转到他们的 Flickr 个人资料以查看更多信息。

以上是 PHPNW12:回顾 的全部内容, 来源链接: utcz.com/z/327487.html

回到顶部