到底三段式版本号是什么,以及 Composer 的波浪线符号 ~ 和幂符号 ^ 到底有啥区别

曾经见过太多乱写版本号的(其实现在比以前好很多了),好多 1.9.0 的下个版本必然是 2.0.0, 2.9.0 下个版本必须 3.0.0……主要还是因为之前对版本号的命名就没有规范,大家都是看心情写。后来 semantic versioning 得到推广,版本号取名的情况得到改善,但依然有很多人不知道三段式版本号是什么含义(各种培训学校你们教一下这些规范会死么……)。

简单来说(我也就是搬运一下,上面提到的网站说的更清楚),三段式版本号各个段的含义是:…

软件开发的十二要素(准则)

简介

如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论:

  • 使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目。
  • 和操作系统之间尽可能的划清界限,在各个系统中提供最大的可移植性
  • 适合部署在现代的云计算平台,从而在服务器和系统管理方面节省资源。
  • 将开发环境和生产环境的差异降至最低,并使用持续交付实施敏捷开发。
  • 可以在工具、架构和开发流程不发生明显变化的前提下实现扩展

这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发的应用程序。

背景

本文的贡献者者参与过数以百计的应用程序的开发和部署,并通过 Heroku 平台间接见证了数十万应用程序的开发,运作以及扩展的过程。

本文综合了我们关于 SaaS 应用几乎所有的经验和智慧,是开发此类应用的理想实践标准,并特别关注于应用程序如何保持良性成长,开发者之间如何进行有效的代码协作,以及如何 避免软件污染 。

我们的初衷是分享在现代软件开发过程中发现的一些系统性问题,并加深对这些问题的认识。我们提供了讨论这些问题时所需的共享词汇,同时使用相关术语给出一套针对这些问题的广义解决方案。本文格式的灵感来自于 Martin Fowler 的书籍: 

symfony 4 框架安装与使用指南

symfony 4 框架安装与使用指南

注意:需要用PHP7.1版本进行操作。

创建一个新项目

第一步是创建项目。目前, 这需要通过composer create-project来完成。我们可能会释放一个工具来更快地引导项目。

走起:

composer create-project symfony/skeleton demo
cd demo

 

该命令将下载骨架, 该框架仅由一个composer.json文件组成。

 

然后, 它将文件提取到demo目录中, 并自动运行composer installsymfony/flex是要安装的第一个包, 以便它可以挂钩到Composer进程。当Composer安装 (或更新) 其他依赖项时, flex

JS工具库封装:Video转换成Canvas

在PC端,IE9+浏览器对原生视频的支持还是很不错的,然而一到了移动端就会各种兼容性的坑爹问题。

在移动端,各大浏览器厂商对视频会植入许多他们自定义的交互方式(如默认全屏播放、视频不能初始化播放、窗口置顶等等),更坑爹的是这些被植入的交互还无法去掉。移动端的视频行内自动播放看起来确实很棘手。

目前主流有两种方法处理移动端的视频播放问题:

一种是改设计和说服需求方,即使视频不能自动播放或者置顶也不影响页面展示的主要体验;

另一种便是使用canvas来替代video。…

linux 之信号signal处理机制

最近同事的程序设计过程中用到了Linux的signal机制,从而引发了我对Linux中signal机制的思考。Signal机制在Linux中是一个非常常用的进程间通信机制,很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断,因此,在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。

个进程都会采用一个进程控制块对其进行描述,进程控制块中设计了一个signal的位图信息,其中的每位与具体的signal相对应,这与中断机制是保持一致的。当系统中一个进程A通过signal系统调用向进程B发送signal时,设置进程B的对应signal位图,类似于触发了signal对应中断。发送signal只是“中断”触发的一个过程,具体执行会在两个阶段发生:

1、  system call返回。进程B由于调用了system call后,从内核返回用户态时需要检查他拥有的signal位图信息表,此时是一个执行点。

2、  中断返回。进程被系统中断打断之后,系统将CPU交给进程时,需要检查即将执行进程所拥有的signal位图信息表,此时也是一个执行点。

 

综上所述,signal的执行点可以理解成从内核态返回用户态时,在返回时,如果发现待执行进程存在被触发的signal,那么在离开内核态之后(也就是将CPU切换到用户模式),执行用户进程为该signal绑定的signal处理函数,从这一点上看,signal处理函数是在用户进程上下文中执行的。当执行完signal处理函数之后,再返回到用户进程被中断或者system call(软中断或者指令陷阱)打断的地方。

 

Signal机制实现的比较灵活,用户进程由于中断或者system call陷入内核之后,将断点信息都保存到了堆栈中,在内核返回用户态时,如果存在被触发的signal,那么直接将待执行的signal处理函数push到堆栈中,在CPU切换到用户模式之后,直接pop堆栈就可以执行signal处理函数并且返回到用户进程了。Signal处理函数应用了进程上下文,并且应用实际的中断模拟了进程的软中断过程。

 

最近写程序,各种bug各种错,有一回程序莫名退出,没报错,也没产生日志和core文件,貌似正常退出一样。

但又不是在程序全部走完后退出,中途莫名退出,这就叫我想到了signal,应该是某些函数错误后发送kill信号给主进程,然后退出。

现在总结下signal各种类型:

Signal
Description
SIGABRT
由调用abort函数产生,进程非正常退出
SIGALRM
用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
SIGBUS
某种特定的硬件异常,通常由内存访问引起
SIGCANCEL
由Solaris Thread Library内部使用,通常不会使用
SIGCHLD
进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT
当被stop的进程恢复运行的时候,自动发送
SIGEMT
和实现相关的硬件异常
SIGFPE

如何防止PHP进程异常退出(进程被杀)?

背景

通常,在cli下运行的常驻后台PHP进程,可能异常退出,比如php执行过程中出现的致命错误,或被 kill 命令手动杀死等。如下面的php代码:

<?php
while(1){
    $content = fgets(STDIN);
    if(empty($content)){
        sleep(1);
    }
    //逻辑处理部分代码省略
}
?>

 

查错

我们使用register_shutdown_function可以跟踪到底是什么错误导致的进程退出。(想更多了解register_shutdown_function,请查看博文 妙用php中的register_shutdown_function和fastcgi_finish_request)加入了错误捕捉代码。如下:

<?php
$is_end = false;
function catch_error(){
        global $is_end;
        $time = date('Y-m-d H:i:s');
        $error = error_get_last();
        $msg = "$time [error]";
        if($is_end){
                

Win7 + Ubuntu 18.04 LTS (Bionic Beaver)双系统安装方法

这里介绍在win7的基础上,安装ubuntu 18.04 LTS,实现双系统启动。

首先,假设你已安装了windows 7系统。

一. 制作ubuntu U盘启动盘。

方法见http://blog.p2hp.com/archives/4123

ubuntu 安装文件下载地址 http://releases.ubuntu.com/bionic/ubuntu-18.04-desktop-amd64.iso

二. 把U盘插入电脑,重启电脑。(记得进入BIOS设置,把U盘选为第一启动设备)。…

性能之王,MySQL 8.0 GA版本发布!

MySQL 5.7可以被称为近10年最为经典的版本,正如同96年NBA的芝加哥公牛队,2011年的巴塞罗那队。一代王朝建立,远远甩开原本的竞争对手们。Percona、MariaDB、PostgreSQL们足够努力,只是好学生永远无法追赶闪着光芒的天才。回望过去的3年,现在拿着望远镜,MySQL也已找不到对手。

芝加哥公牛队三冠王,巴萨十年王朝告诉我们,王朝一旦建立,将会势不可挡。今天MySQL 8.0版本GA,至此MySQL这艘之前的巡洋舰,摇身变为一搜巨型航母,未来必将开拓更多的领域,影响更多行业对于开源数据库的应用。

MySQL 5.7版本解决了很多企业级数据库应用的痛点,诸多企业从老版本(例如5.5、5.6)升级到了5.7。甚至在传统领域,MySQL也已经撬动和影响了很多行业。5.7.17发布的MySQL Group Replication必将在未来3年内成为金融行业数据库解决方案的事实标准。

MySQL 8.0是新一代的性能之王。200W QPS不再是瓶颈,这狠狠打脸了Redis、MongoDB、MariaDB、PostgreSQL、TiDB这样的竞争对手。当对手们还在对性能遮遮掩掩时,MySQL已然无可挑剔。

云时代,MySQL 8.0带来了包括但不限于以下的诸多新特性:

· InnoDB各模块重构,性能可有30% ~ 100%的大幅提升(具体见:MySQL 8.0 200W QPS!!!InnoDB大重构 #M1005#);

· 更好的从机多线程复制机制(writeset-based MTS)机制,至此彻底解决困扰MySQL多年的从机复制延迟问题(具体见:滚蛋吧,MySQL主从复制延迟 #M1002#);

· 支持基于角色的用户管理,更好地对用户进行更细粒度的管理;

· 基于InnoDB的New Data Diction(新元数据字典),Atomic DDL支持,彻底解决DDL复制时可能遇到的不一致问题(小概率事件)以及大幅提升information_schema性能;

· 新增Partial update

又不一样的 Symfony —— SF4 展望

作为一个 Symfony 框架的老用户,symfony(注意那个年代 s 还是小写的) 诞生于 PHP <5.2 时代,跟 PHP 5.3 时代的 Symfony2 相比简直天壤之别。而最近 Symfony3 的发布让我发现,似乎改动也不是很大,心想该不是 Symfony 也学 Chrome 那样加版本号了吧?这几天 Symfony 开发组老大又开始说 Symfony4 要发布的事情,但内容倒不至于让我太失望,的确变化也不小。下面就来说说老大哥提到了 SF4 到底有哪些变化。…

Page 1 of 13212345...102030...Last »