书写技术成长之路

Mac PHP7.1环境搭建问题

正在使用的PHP7.1环境突然报出了如下错误,

屏幕快照 2018-01-28 下午3.35.38.png

这个错误还没有见过dyld: Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.9.dylib, Google了一番最终解决了。

解决方案:

  1. 先安装libjpeg, brew install libjpeg。以下是截图 屏幕快照 2018-01-28 下午4.01.36.png

  2. 根据命令提示切换

The currently linked version is 8d
You can use `brew switch jpeg 9b` to link this version.`
  1. 运行 brew switch jpeg 9b

  2. 再运行php -v就可以看到php的输出信息了。

github和stackoverflow上有关这个的讨论我试了一番都不行,这次解决也是不断尝试出来的。

参考链接

php72 install libjpeg.8.dylib not found

https://stackoverflow.com/questions/32703296/dyld-library-not-loaded-usr-local-lib-libjpeg-8-dylib-homebrew-php

https://stackoverflow.com/questions/32703296/dyld-library-not-loaded-usr-local-lib-libjpeg-8-dylib-homebrew-php

https://stackoverflow.com/questions/38331388/how-to-install-libjpeg-on-osx

安装PHP

安装PEAR

安装oracle扩展

PHP上线遇到版本问题解决方案

昨天项目上线,本地开发环境和测试环境运行都没问题,到上线运行composer install --no-dev --optimize-autoloader就报了错,原因是composer依赖包要求的版本是PHP 7.1.3, 而生产环境用的PHP版本是7.1.2,所以就报错了。

WechatIMG230.jpeg

产生问题的原因: 由于本地开发用的PHP版本是7.1.3,所以在用composer update安装依赖包的时候composer就直接按照我本地的php版本来安装,这样就导致一个人机器上运行好好的,换到别人机器上就不能运行了。

解决方案: 通常有三种

  • 降低你本地的PHP版本,使你的版本小于线上的版本。
  • 升级服务器的PHP版本。
  • 在composer.json中添加指定平台的PHP版本, 重新运行composer update来更新composer.lock, platform指令就是让你可以模拟生产环境或者你指定的平台

WechatIMG231.jpeg

此三人说的已经很清楚了

Different php versions for development and production · Issue  5163 · composer composer · GitHub.png

参考

https://stackoverflow.com/questions/26277151/force-composer-to-require-php-version-between-version-x-and-version-y

https://getcomposer.org/doc/06-config.md#platform

https://github.com/composer/composer/issues/5163

https://github.com/laravel/homestead/issues/638

MySQL获取数据库表的大小

获取单独的数据库大小

SELECT
  TABLE_NAME AS `Table`,
  ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
  information_schema.TABLES
WHERE
  TABLE_SCHEMA = "db_name"
ORDER BY
  (DATA_LENGTH + INDEX_LENGTH)
DESC;

获取所有数据库的各个表大小

SELECT
  TABLE_SCHEMA AS `Database`,
  TABLE_NAME AS `Table`,
  ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
  information_schema.TABLES
ORDER BY
  (DATA_LENGTH + INDEX_LENGTH)
DESC;

参考 https://chartio.com/resources/tutorials/how-to-get-the-size-of-a-table-in-mysql/

Git常用操作详解

  • 删除远程分支

    git push -d origin branch_name

    git branch -d branch_name

  • 暂存当前的代码

    git stash save -u "your comment message"

  • 应用并删除最新暂存区的代码

    git stash pop

  • 应用暂存区最新的代码

    git stash apply

PHP Hello World 扩展

  1. 从git下载php源码 git clone http://git.php.net/repository/php-src.git
  2. cd php-src
  3. 切换到指定版本的PHP分支, 例如 git checkout PHP-7.1
  4. 构建 ./buildconf
  5. 指定配置 ./configure --prefix=/etc/php7 --enable-debug --enable-maintainer-zts
  6. make
  7. make install
  8. 复制php.ini文件 'cp php.ini-development /etc/php55/lib/php.ini' 到此,PHP已经编译安装好了,下面开始编写扩展

首先生成扩展的基本框架, 进入到php-src的ext目录,执行 ./ext_skel --extname=hello, 如果执行成功会看到一些说明信息。 然后修改hello/config.m4文件,写入自己的函数逻辑

去掉注释PHP_ARG_ENABLE, 结果如下

PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[  --enable-hello           Enable hello support])

然后再注释掉 AC_DEFINE

AC_DEFINE(HAVE_HELLOLIB,1,[ ])

在ext目录下执行phpize会生成一些配置信息,然后指定配置 ./configure --enable-hello

再次修改helo.c文件 vim hello.c, 添加以下代码

/* {{{ proto string hello_world(string arg)
   Say Hello World to everyone */
PHP_FUNCTION(hello_world)
{
    RETURN_STRING("Hello world");
}
/* }}} */

并更新zend_function_entry函数体

const zend_function_entry hello_functions[] = {
    PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */
    PHP_FE(hello_world, NULL)
    PHP_FE_END  /* Must be the last line in hello_functions[] */
};

编译 make

运行 php -i | grep hello查看是否有该扩展,也可以直接修改php.ini文件,在最后面加入extension=hello.so并把编译生成的hello.so复制到PHP扩展目录下就好了, cp /php-src/ext/hello/modules/hello.so /etc/php55/lib/php/extensions/no-debug-non-zts-20121212

执行 php -r 'echo hello_world();'就可以看到hello world了。

参考

http://ahungry.com/blog/2016-09-29-Creating-a-php-7-extension.html

PHP编译安装

从git仓库下载代码,这样可以随时切换不同的PHP版本

1. git clone http://git.php.net/repository/php-src.git
2. cd php-src
3. git checkout PHP-5.5
4. 安装编译所需要的各种开发工具 sudo yum groupinstall 'Development Tools' 或者 yum install gcc gcc-c++ make openssl-devel libxml2 libxml2-devel
5. 构建 ./buildconf --force
6. 编译 './configigure --prefix=/etc/php55 --enable-debug --enable-maintainer-zts' prefix指定PHP的安装路径,可改为你自己的, 开启调试模式和下次线程安全
7. make
8. make install
9. 更改环境变量 vim /etc/profile 加入 PATH=$PATH:/etc/php55/bin; SOURCE PATH;
10. 执行'php --ini'查看是否成功, 发现没有ini配置文件,执行'cp php.ini-development /etc/php55/lib/php.ini'

在Redhat 7上编译安装PHP的时候,遇到了不支持bison的问题

Error Message: checking for bison... bison -y
checking for bison version... invalid
configure: WARNING: bison versions supported for regeneration of the Zend/PHP parsers: 1.28 1.35 1.75 1.875 2.0 2.1 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.5 2.5.1 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.7 (found 3.0).

bugs.php.net找到了答案,最后发现只有PHP7才开始支持bison 3.0版本,以下是官网的解释

When building directly from Git sources or after custom modifications you might also need:

autoconf: 2.13+ (for PHP < 5.4.0), 2.59+ (for PHP >= 5.4.0)
automake: 1.4+
libtool: 1.4.x+ (except 1.4.2)
re2c: Version 0.13.4 or newer
flex: Version 2.5.4 (for PHP <= 5.2)
bison:
PHP 5.4: 1.28, 1.35, 1.75, 1.875, 2.0, 2.1, 2.2, 2.3, 2.4, 2.4.1, 2.4.2, 2.4.3, 2.5, 2.5.1, 2.6, 2.6.1, 2.6.2, 2.6.4
PHP 5.5: 2.4, 2.4.1, 2.4.2, 2.4.3, 2.5, 2.5.1, 2.6, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.7
PHP 5.6: >= 2.4, < 3.0
PHP 7.0: 2.4 or later (including Bison 3.x)
解决方案
  1. 卸载yum安装的bison, sudo yum remove bison
  2. 下载2.6.4版本并编译安装
wget http://ftp.gnu.org/gnu/bison/bison-2.6.4.tar.gz
tar -xvzf bison-2.6.4.tar.gz
cd bison-2.6.4
./configure
make && make install
  1. 更改环境变量 vim /etc/environment
PATH=$PATH:/usr/local/bin
export PATH
  1. 使环境变量生效: source /etc/environment, 运行bison -V查看bison版本
参考

http://www.phpinternalsbook.com/build_system/building_php.html#why-not-use-packages

https://bugs.php.net/bug.php?id=69055

http://php.net/manual/en/install.unix.php

https://github.com/php-build/php-build

Android开发第一天

activity_main.xml中,xml前面不能有空行

Picasso 图片异步下载库 https://github.com/square/picasso

永远不要在主线程里面做耗时久的任务,否则就是一场噩梦。

Android 实例代码 https://www.bignerdranch.com/solutions/AndroidProgramming3e.zip

Linux Crontab 介绍

Crontab是Linux下用于管理定时任务运行的工具,常用的命令有两个crontab -ecrontab -l

有两种方式可以建定时任务

  • 第一种,每个用户都可以建立自己的crontab,直接输入crontab -e便可建立自己的crontab,建议用于临时测试。
  • 第二种,编辑文件vim /etc/crontab,这种方式便于系统的统一管理和调度,避免找不到哪些crontab是由哪些用户建的问题,推荐此方式。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

# 如上说明了crontab的基本语法,以及可以指定运行crontab的用户身份。
# 比如下面的例子指定了以www用户的身份来运行,这种指定用户的方式可以很好的避免权限所带来的一些问题。
# * * * * * www php artisan queue:work