php 报错 date default timezone get

今天在使用satis生成网页

php bin/satis build satis.json public/

报了如下的错误:

[Twig_Error_Runtime]
An exception has been thrown during the rendering of a template ("date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.").

[ErrorException]
date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. 

解决方法:

修改php.ini配置文件(我的路径为C:\my_pp\php\php-5.5.30-nts-Win32-VC11-x64\php.ini)

在php.ini配置文件中找到: ;date.timezone =

date.timezone = "Asia/Shanghai"

修改完后,重启apache/nginx。


使用 laravel 的 queryScope 处理 relations

本文是 Laravel scope 的两个应用技巧。在官方文档 5.1 的文档中给出的是这样的描述。

全局作用域(Global Scopes)可让你定义有限制的共用集合,它可以轻松地在你的应用程序中被重复使用。例如,你可能需要频繁地获取所有被认为是「受欢迎的」用户。要定义此范围,则可以简单地在 Eloquent 模型方法前面加上前缀 scope. 它总是返回查询构造器的实例.

scope 的便利之处在于在繁杂的数据中确定出数据间的逻辑关系。在简单的应用中,按照官方文档,scope 已经很好满足了我们的要求了。在下面的例子中,我在 trait 中定义了一系列具有共性的 scope:

namespace App\Supports;

use Carbon\Carbon;

trait ScopeTrait
{
    /**查询创建时间
     * 使用 prefix 是历史原因使用了 leftjoin.
     * @param $query
     * @return mixed
     */
    public function scopeCreatedAt($query, $start = '', $end = '', $equal = true)// start <= target < end
    {
        $className = get_class($this);
        $prefix = $className::TABLE . '.';
        if ($start) {
            $compare = $equal ? '>=' : '>';
            $query->where($prefix .'created_at', $compare, $start);
        }
        if ($end) {
            $query->where($prefix .'created_at', '<', $end);
        }
        return $query;
    }
    
    public function scopeSource($query, $source)
    {
        $className = get_class($this);
        $prefix = $className::TABLE . '.';
        if ($source) {
            $query->where($prefix . 'source', '=', $source);
        }
        return $query;
    }

    public function scopeYesterday($query)
    {
        $start = Carbon::yesterday();
        $end = Carbon::today();
        return $query->createdAt($start, $end);
    }
}

我们通过这个方法查询某个时间段内表的有效数据。假定 Account 表中使用了这个 trait,需要查找昨天创建的帐号,可以这么使用:

$accounts = Account::yesterday()->get();

在 laravel Eloquent ORM 中还经常用到 with 这一方法来关联表。普通的使用场景也很简单,例如

class Talent{
    public function account()
    {
        return $this->belongsTo('App\Models\Account', 'account_uuid');
    }
}

使用 Talent::with(‘account’) 就可以获取到关联数据。如果希望leftjoin,可以在行内使用如下语句实现:

$yesterdayCreateTalent = Talent::with(['account' => function ($q) {
  $q->yesterday();
}])->get();

也可以拆分方法进行使用。

// Talent
public function test()
{
   return $this->belongsTo('App\Models\Account', 'account_uuid')->yesterday();
   // or
   // return $this->account()->yesterday();
}

参考资料


PHP 的字符串和数组的转换函数 explode() 和 implode()

一年一度的春节终于过去啦๑乛◡乛๑ 。今年春节一直比较闲,终于有闲心下来看一些架构方面的书了。最近已经习惯于用微信读书了,感觉不愧是腾讯做的东西。读书应用里我用过的很多,包括京东,豆瓣,Amazon,多看阅读,百度阅读,都有用过,而且为之付费不菲,断断续续看了几本书,没办法养成习惯。一部分原因可以归咎于自己确实没有毅力,另一部分感觉还是 app 做的有欠缺。

微信读书在这方面做的感觉很到位,背靠腾讯大靠山,首先流量不缺,通过首批核心用户在朋友圈网络进行宣传推广,在此之上的推广还能得到5个书币,获得的书币可以拿来买书;除了推广获得书币外,还可以通过阅读时间来兑换,不得不说这个方式太赞了,反过来又促进了爱书用户更多地看书。除了看书的核心功能,腾讯理所当然还加入了社交功能社交功能(爱恨交加的社交,说好的用完即走呢,傲娇的张小龙,╮(╯3╰)╭),相比于其它几种阅读app,微信做的实在是太赞了。看好微信读书的未来。

另外今天发现了一个有趣的网站http://hepwori.github.io/execorder/,哈哈哈,反正效果是这样的:

好了,下面是正文。

explode()

把字符串打散为数组。

语法

explode(separator,string,limit)

* separator	必需。规定在哪里分割字符串。
* string	必需。要分割的字符串。
* limit	    可选。规定所返回的数组元素的数目。
            大于 0 - 返回包含最多 limit 个元素的数组
            小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组
            0 - 返回包含一个元素的数组

例子:

$str = "Hello world. I love Shanghai!";
var_dump(explode(" ",$str));

真实例子:

public function setExpectedIndustryTagAttribute($value)
{
    if (is_string($value)) {
        $array = explode(' ', $value);
        $array = array_filter($array);
        $this->attributes['tag'] = json_encode($array);
    }

    if (is_array($value)) {
        $this->attributes['tag'] = $value;
    }
}

implode()

把数组元素组合为字符串。

语法

implode(separator,array)

* separator	可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
* array	必需。要组合为字符串的数组。

例子:

$arr = array('Hello','World!','I','love','Shanghai!');
echo implode(" ",$arr)."<br>";
echo implode("+",$arr)."<br>";
echo implode("-",$arr)."<br>";
echo implode("X",$arr);

Docker pull 出现的 TLS handshake timeout

一直以来都是使用国外的服务器,因而对 docker 速度慢并没有特别的感觉。然而在本地做测试,还是需要docker,于是就出现了这个问题了。

docker pull voduytuan/jenkins-php-docker

... ...
error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/f7/f7fbb8679343e6cbf232ca1ecbe4fd019748a50046cc391411719c52c865bf5a/data?Expires=1488249661&Signature=DgwydePkO~fs0pg3CPbf3GCtC05-n--9-1kO0XRpqKZLAobNcEWnTTEnSD8SSk1QevOQPk6jMFda4YEMJOQGXSrf4AxwAOt~VzgwWSLXKfq9u4gu0gxghsiOzsQ4MNBS3Kk9ZXJWuW3iqcs9G1LkGhW7-yHmhlu0-yEEKD9DeUE_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q: net/http: TLS handshake timeout 好在 DaoCloud 发布了国内的镜像仓库,解决了这个问题。

$ echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io\"" | sudo tee -a /etc/default/docker
$ sudo service docker restart

重启docker服务后,再次push,就完全ok了。

做到这一步已经够用了。如果想使用daocloud的升级版,还可以安装DaoCloud Toolbox,速度更是飞起来。

更新:

docker 官方已经也做了国内的镜像源地址,具体修改方式参考这里:CentOS 源与 Docker 源加速的设置

参考资料


一些运维技巧的备忘

计划任务cron

计划任务不必要在直接写在底层的 crontab 中,可以在 crontab 中这么设置

将运行脚本文件保存到 /var/local/cron 目录中,区分好时间和用户进行管理。

ssh相关

ssh除了登录端口修改外,在当前用户的家目录下 ~/.ssh 添加 config 文件,用于快速登录其他服务器或 scp 进行文件传输。

Host    tokyo
  HostName        xx.xx.xx.xx
  Port            1234
  User            kelu
  IdentityFile    ~/.ssh/xxx
Host    fremont
  HostName        xx.xx.xx.xx
  Port            1234
  User            madcat
  IdentityFile    ~/.ssh/xxx

除此之外,还可以修改 /etc/hosts,用于快速ping某某网站等等。

  127.0.0.1       localhost
  xx.xx.xx.xx   tokyo
  xx.xx.xx.xx   aliyun

Windows下重启php

在 Linux 中我们可以把 php-fpm 重启,达到重新加载配置文件的作用。然而在 Windows 中并没有这样的管理程序,那么怎么办呢?

在 windows 中 php 不是单独的进程,所以我们只要简单的重启一下 iis/apache/nginx 启动一下即可。

233333就是这么傻瓜。


互联网开发者的免费好产品

给平时开发时常用的一些免费的互联网产品做个列表记一下。绝大多数是免费的。也有我认为非常好用的收费的产品。有些产品点击注册是有推广费的,如果大家需要的话欢迎使用点击链接使用我的推广码注册。

运维类

  1. 监控宝 一项提供网站性能监控的在线服务,可以快速了解网站的性能、可用率、用户体验、服务器性能等。 免费版提供6个网站监控、2个服务器监控、2个服务器性能监控项目。 短信配额100条。

  2. dnspod 是一个DNS解析服务商。免费的够用了。把域名的dns托管在这里。国内的解析速度很快。

  3. incapsula 国外的CDN服务提供商。免费的我在用着,拿来加速github上的blog。还不错。

  4. freenom 免费域名申请网站。提供tk ga cf gq ml等域名的免费申请

  5. heroku 一个支持多种编程语言的PaaS.注册后绑定信用卡,每个月就可以在最小费用内使用1000小时,相当于免费。(注意不要超限,很贵的

  6. easyops 服务器管理平台。

  7. linode 一直在用的vps服务商。稳定性无与伦比。

产品类

  1. 腾讯企业邮箱 免费用户有50个额度,确实不错。

  2. sendcloud 据说是搜狐的产品,批量发送邮件,到达率高,免费用户200封/天。

  3. 七牛云 搞(图片)云存储起家的。免费用户有 10 GB 免费空间,每月 10 GB 下载流量。

  4. PxCook 像素大厨 标注切图,一起搞定!专注设计本质。

  5. 谷歌Analysis 谷歌站长工具

  6. 10 Minute Mail 临时邮箱

开发类

  1. fontawesome 字体图标

  2. composer packagist composer 工具包搜索

工具类

  1. dribbble 面向设计师的网站

  2. pixiv 面向插画师的网站

  3. 站长工具chinaz 面向站长的工具包

  4. IPIP.net 专注于与地理位置定位相关的数据的整理与发行

  5. ncpssd.org 国家哲学社会科学文献中心。下载论文不要钱。

其它常见产品

下面都是一些备选的产品,因为这样那样的原因,我并没有用。

  1. 搬瓦工 一个vps服务商

  2. Vultr又一个vps服务商

  3. Digital Ocean又一个vps服务商。

  4. 神策数据用户行为分析。

未完待续,持续更新。

细节小知识

  1. 查询线路是否是 cn2 线路

IPIP.net 查询路由节点,如果经过59.43.x.x 的ip,那么该线路就是CN2 。