PHPTS:一键免费搭建 Nginx + PHP + MySQL + Redis + Memcached 网站、APP、小程序服务器端运行环境
[ 2019-12-25 22:03 | by 张宴 ]
传承自 APMServ 的 PHPTS,十年后隆重推出。
PHPTS 边缘计算协作服务器套件,是 Windows 系统上一键搭建 Nginx + PHP + MySQL + Memcached + Redis + MongoDB + InfluxDB 等网站、APP、小程序服务器端运行环境的软件。
它即可以运行在云服务器上用于生产环境,也能够运行在个人电脑上作为编程开发环境。任何个人和企业,均可免费使用,包括商用用途,并可与自有产品集成发布。
PHPTS 未来更大的用途,是运行在本地服务器、PC台式机、笔记本电脑、工控机上,作为边缘计算节点服务器,与摄像头、存储、音响、投屏、打印机、串口设备、工业设备、物联网终端互联互通,利用本地计算机、显卡实现AI人工智能运算、语音合成、人脸识别、视频流分析、音视频转码,不必购买各大公有云平台按次数、按时间、按使用量收费的昂贵计算型云服务;并将利用光纤宽带、5G网络与公有云互联,组建私有云、混合云。
【2020年02月15日 PHPTS 1.07 版本发布】
软件下载,请访问 PHPTS 官方网站:https://www.phpts.com/
PHPTS 1.06 版本,集成 Nginx 1.17.8、PHP 7.4.2、PHP 7.3.14、PHP 5.6.40、MySQL 8.0.19(x64)、Memcached 1.5.22、Redis 4.0.14(x64)、MongoDB 4.3.3(x64)、phpMyAdmin 5.0.1、Bash 终端,并可通过组件方式下载安装 InfluxDB(时间序列数据库)、HeidiSQL(MySQL客户端管理工具)、Another.Redis.Desktop.Manager(Redis客户端管理工具)。推荐在64位 Windows 系统上安装 PHPTS。
Nginx for PHPTS 是专门为 Windows 移植的高并发版本,采用 Windows 输入输出完成端口(IOCP),媲美 Linux 下的 epoll。
相比于官方 Nginx Windows 版本仅支持 1024 连接数、仅支持低效的 SELECT/POLL 模型、仅支持单进程,PHPTS Windows 版本支持 32768 连接数、支持 IOCP 模型、支持多进程能够充分利用多核 CPU。从此 Nginx Windows 版本性能低下、不能用于生产环境成为历史。
PHPTS 软件功能界面截图
Nginx 虚拟主机:
PHP:
MySQL:
Memcached:
Redis:
InfluxDB 时间序列数据库:
MongoDB 面向文档数据库:
Linux Bash 仿真终端:
软件下载,请访问 PHPTS 官方网站:https://www.phpts.com/
PHPTS 边缘计算协作服务器套件,是 Windows 系统上一键搭建 Nginx + PHP + MySQL + Memcached + Redis + MongoDB + InfluxDB 等网站、APP、小程序服务器端运行环境的软件。
它即可以运行在云服务器上用于生产环境,也能够运行在个人电脑上作为编程开发环境。任何个人和企业,均可免费使用,包括商用用途,并可与自有产品集成发布。
PHPTS 未来更大的用途,是运行在本地服务器、PC台式机、笔记本电脑、工控机上,作为边缘计算节点服务器,与摄像头、存储、音响、投屏、打印机、串口设备、工业设备、物联网终端互联互通,利用本地计算机、显卡实现AI人工智能运算、语音合成、人脸识别、视频流分析、音视频转码,不必购买各大公有云平台按次数、按时间、按使用量收费的昂贵计算型云服务;并将利用光纤宽带、5G网络与公有云互联,组建私有云、混合云。
【2020年02月15日 PHPTS 1.07 版本发布】
软件下载,请访问 PHPTS 官方网站:https://www.phpts.com/
PHPTS 1.06 版本,集成 Nginx 1.17.8、PHP 7.4.2、PHP 7.3.14、PHP 5.6.40、MySQL 8.0.19(x64)、Memcached 1.5.22、Redis 4.0.14(x64)、MongoDB 4.3.3(x64)、phpMyAdmin 5.0.1、Bash 终端,并可通过组件方式下载安装 InfluxDB(时间序列数据库)、HeidiSQL(MySQL客户端管理工具)、Another.Redis.Desktop.Manager(Redis客户端管理工具)。推荐在64位 Windows 系统上安装 PHPTS。
Nginx for PHPTS 是专门为 Windows 移植的高并发版本,采用 Windows 输入输出完成端口(IOCP),媲美 Linux 下的 epoll。
相比于官方 Nginx Windows 版本仅支持 1024 连接数、仅支持低效的 SELECT/POLL 模型、仅支持单进程,PHPTS Windows 版本支持 32768 连接数、支持 IOCP 模型、支持多进程能够充分利用多核 CPU。从此 Nginx Windows 版本性能低下、不能用于生产环境成为历史。
PHPTS 软件功能界面截图
Nginx 虚拟主机:
PHP:
MySQL:
Memcached:
Redis:
InfluxDB 时间序列数据库:
MongoDB 面向文档数据库:
Linux Bash 仿真终端:
软件下载,请访问 PHPTS 官方网站:https://www.phpts.com/
如愿以偿将博客的VPS迁到韩国
[ 2014-8-27 01:49 | by 张宴 ]
这几天,原博客所在的美国洛杉矶digitalocean的VPS不稳定,决定再次搬迁。现在已经将博客(http://zyan.cc)迁移到韩国的VPS。国内到韩国的网络线路,应该是最好的,甚至可以媲美中国国内的双线机房。
北京联通 ping zyan.cc:
广东电信 ping zyan.cc:
杭州阿里云 ping zyan.cc:
北京联通 ping zyan.cc:
root@linaro-alip:~# ping zyan.cc
PING zyan.cc (27.255.71.186) 56(84) bytes of data.
64 bytes from 27.255.71.186: icmp_req=1 ttl=50 time=68.3 ms
64 bytes from 27.255.71.186: icmp_req=2 ttl=50 time=63.0 ms
64 bytes from 27.255.71.186: icmp_req=3 ttl=50 time=67.4 ms
64 bytes from 27.255.71.186: icmp_req=4 ttl=50 time=69.5 ms
64 bytes from 27.255.71.186: icmp_req=5 ttl=50 time=62.9 ms
64 bytes from 27.255.71.186: icmp_req=6 ttl=50 time=69.9 ms
64 bytes from 27.255.71.186: icmp_req=7 ttl=50 time=63.2 ms
PING zyan.cc (27.255.71.186) 56(84) bytes of data.
64 bytes from 27.255.71.186: icmp_req=1 ttl=50 time=68.3 ms
64 bytes from 27.255.71.186: icmp_req=2 ttl=50 time=63.0 ms
64 bytes from 27.255.71.186: icmp_req=3 ttl=50 time=67.4 ms
64 bytes from 27.255.71.186: icmp_req=4 ttl=50 time=69.5 ms
64 bytes from 27.255.71.186: icmp_req=5 ttl=50 time=62.9 ms
64 bytes from 27.255.71.186: icmp_req=6 ttl=50 time=69.9 ms
64 bytes from 27.255.71.186: icmp_req=7 ttl=50 time=63.2 ms
广东电信 ping zyan.cc:
[root@local ~]# ping zyan.cc
PING zyan.cc (27.255.71.186) 56(84) bytes of data.
64 bytes from 27.255.71.186: icmp_seq=1 ttl=46 time=93.6 ms
64 bytes from 27.255.71.186: icmp_seq=2 ttl=46 time=93.2 ms
64 bytes from 27.255.71.186: icmp_seq=3 ttl=46 time=92.8 ms
64 bytes from 27.255.71.186: icmp_seq=4 ttl=46 time=93.0 ms
64 bytes from 27.255.71.186: icmp_seq=5 ttl=46 time=93.0 ms
64 bytes from 27.255.71.186: icmp_seq=6 ttl=46 time=92.7 ms
PING zyan.cc (27.255.71.186) 56(84) bytes of data.
64 bytes from 27.255.71.186: icmp_seq=1 ttl=46 time=93.6 ms
64 bytes from 27.255.71.186: icmp_seq=2 ttl=46 time=93.2 ms
64 bytes from 27.255.71.186: icmp_seq=3 ttl=46 time=92.8 ms
64 bytes from 27.255.71.186: icmp_seq=4 ttl=46 time=93.0 ms
64 bytes from 27.255.71.186: icmp_seq=5 ttl=46 time=93.0 ms
64 bytes from 27.255.71.186: icmp_seq=6 ttl=46 time=92.7 ms
杭州阿里云 ping zyan.cc:
[root@AY140521163455018f38Z ~]# ping zyan.cc
PING zyan.cc (27.255.71.186) 56(84) bytes of data.
64 bytes from 27.255.71.186: icmp_seq=1 ttl=48 time=30.8 ms
64 bytes from 27.255.71.186: icmp_seq=2 ttl=48 time=30.5 ms
64 bytes from 27.255.71.186: icmp_seq=3 ttl=48 time=30.4 ms
64 bytes from 27.255.71.186: icmp_seq=4 ttl=48 time=30.7 ms
64 bytes from 27.255.71.186: icmp_seq=5 ttl=48 time=30.6 ms
64 bytes from 27.255.71.186: icmp_seq=6 ttl=48 time=30.3 ms
64 bytes from 27.255.71.186: icmp_seq=7 ttl=48 time=31.2 ms
PING zyan.cc (27.255.71.186) 56(84) bytes of data.
64 bytes from 27.255.71.186: icmp_seq=1 ttl=48 time=30.8 ms
64 bytes from 27.255.71.186: icmp_seq=2 ttl=48 time=30.5 ms
64 bytes from 27.255.71.186: icmp_seq=3 ttl=48 time=30.4 ms
64 bytes from 27.255.71.186: icmp_seq=4 ttl=48 time=30.7 ms
64 bytes from 27.255.71.186: icmp_seq=5 ttl=48 time=30.6 ms
64 bytes from 27.255.71.186: icmp_seq=6 ttl=48 time=30.3 ms
64 bytes from 27.255.71.186: icmp_seq=7 ttl=48 time=31.2 ms
由于中国移动屏蔽原 s135.com 域名,现启用新域名 zyan.cc 作为博客新域名,VPS主机迁移到 digitalocean ( https://www.digitalocean.com/ )。
PHP 真正多线程的使用
[ 2013-12-17 11:17 | by 张宴 ]
PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。
我之前的文章中说过,大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统、环境都不用安装配置),而是在于MySQL数据库。如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。如果加上PHP多线程,通过十个线程同时查询NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。
PHP扩展下载:https://github.com/krakjoe/pthreads
PHP手册文档:http://php.net/manual/zh/book.pthreads.php
1、扩展的编译安装(Linux),编辑参数 --enable-maintainer-zts 是必选项:
添加:
2、给出一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例:
我之前的文章中说过,大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统、环境都不用安装配置),而是在于MySQL数据库。如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。如果加上PHP多线程,通过十个线程同时查询NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。
PHP扩展下载:https://github.com/krakjoe/pthreads
PHP手册文档:http://php.net/manual/zh/book.pthreads.php
1、扩展的编译安装(Linux),编辑参数 --enable-maintainer-zts 是必选项:
cd /Data/tgz/php-5.5.1
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install
unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install
unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
vi /Data/apps/php/etc/php.ini
添加:
extension = "pthreads.so"
2、给出一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例:
移动互联网初创型团队需要什么样的云计算服务?
[ 2013-10-28 15:23 | by 张宴 ]
对于创业型团队来说,服务器托管费用+带宽成费用+运维成本,是压在头上的三座大山。满足业务性能需要,又要降低成本,尽快实现收支平衡,是当务之急。
一、不靠谱的 App Engine
1、Google App Engine 云服务在国外的成功,不代表国内巨头们各种 *AE 仿造品的成功。在微博上搜搜就可以看到小伙伴们吐槽的各种不稳定,另外,*AE们对资源使用最大数各种规定限制,加上为了计费、阉割功能的各种限制,使它的价格优势成为鸡肋。*AE们就好比100M共享带宽的小区宽带,以低价卖给每个上网用户5M的带宽,前几十个用户感觉这网速真不错,等他卖了100个以上用户5M带宽,而这部分用户白天上班去了,晚上下班回来都在上网,其中又有一部分看视频、BT下载,于是乎,白天网速快,晚上慢得要死,连200K带宽都达不到。要知道,不怕神一样的对手,就怕猪一样的队友,在国内的 App Engine 环境下,水平参差不齐的开发者的代码质量、习惯性的资源滥用、别人网站被攻击殃及池鱼对*AE性能的影响,导致*AE的稳定性非常差。
2、所以,*AE们也意识到公共 App Engine 不稳定,所以又推出专用 App Engine,但费用一下就翻了很多倍。所以,*AE只是个人博客、个人开发者玩玩的工具,真正用作项目,还是需谨慎。根据实际的经验,*AE们还真不如VPS稳定。
二、成本低的小而美VPS
1、对于初创团队来说,购买服务器、交换机,托管服务器费用、带宽月使用费,是极其昂贵的。购买可以弹性升级硬件配置的云服务VPS,是降低成本不错的选择。国内VPS,1G内存、1~2核CPU、1M带宽、多线BGP,大概价格在100元/月左右,支持备案,可以作为最低入门选择,有条件可以购买两台互为热备,阿里云主机可以作为参考。大多数VPS服务商使用的都是廉价的SATA磁盘。如果你对磁盘IO要求较高,可以选择提供有SAS磁盘的IAAS云主机服务商,比如UCloud。
2、市场上的VPS商家主要有 Xen、OpenVZ、KVM 三种开源的虚拟化技术。全虚拟化的 Xen 更像独立主机,服务器资源按VPS实际大小平均分配,一般无法超售。半虚拟化的 OpenVZ 在同样的性能测试下,会比 Xen 高一些,但是,一台物理内存16G的服务器,可以分配出总内存大小超过16G很多倍的VPS,服务商可以超售,想卖多少台VPS就可以卖多少台,所以不推荐使用。KVM 在最新的 Linux 发行版中,已经是集成,但是,商业化应用还不成熟,基于 KVM 的 VPS 服务商很少。
3、VPS的操作系统,建议选择64位的Linux。在32位Linux下,PHP能给处理的整数不能超过正负2^31=2147483648,如果以后接入新浪微博、淘宝、腾讯等第三方开放平台,他们的接口里会有超过32位的整数(比如新浪用户ID、淘宝商品ID)。如果不幸使用32位Linux,你只能将这些整数当成字符串处理了,以后配合Sphinx等搜索引擎,会非常麻烦。
4、现在,可以在北京进行备案的域名有:国际域名 .com .net .org,国内域名 .cn .com.cn .中国,国别域名 .cc,其他的域名均不能进行备案。仅北京有限制,其它省市正常提交备案即可。我们原来申请的 .me 域名,在北京无法备案,后来只好拿到苏州去备案了。所以,在选择域名的时候,需要慎重。
5、使用 VPS,一定要定期在本地,做好数据备份,不要相信所谓的 7*24服务,99.99%安全稳定性,只要有人的VPS出问题了,都归为那 0.01%。
三、应对峰值带宽的云存储
1、对于DAU(日活跃用户)过十万的网站、APP应用来说,CDN或云存储是必需品。使用云存储不是因为存储空间,因为一块几TB的SATA磁盘很便宜,使用云存储是因为高出平均带宽值几倍至几十倍的峰值带宽。做手机APP应用,峰值带宽更集中,当你向所有用户群发PUSH一条消息,用户被唤醒打开APP应用,几分钟的时间,会消耗几十倍的带宽峰值。图片、下载,是最主要的带宽消耗者。也许,数据接口API只需不到1M的带宽,而图片对带宽的峰值需求则会达到100M。为了几分钟的峰值,去购买100M昂贵的带宽,其他时间带宽都空闲,是一件非常奢侈的事。
2、国内提供云存储服务的商家有很多,真正好用得却不多,提供FTP等公共通用协议的云存储更是微乎其微。使用第三方云服务,切忌千万不要吊死在一棵树上。支持FTP等公共协议,如果将来有问题,能够方便的进行数据迁移和技术替代。如果云服务厂商一直能够提供优质的服务,那么,也就可以长期使用他们的云服务。相信优秀的云存储提供商,是不会惧怕这一点的。
一、不靠谱的 App Engine
1、Google App Engine 云服务在国外的成功,不代表国内巨头们各种 *AE 仿造品的成功。在微博上搜搜就可以看到小伙伴们吐槽的各种不稳定,另外,*AE们对资源使用最大数各种规定限制,加上为了计费、阉割功能的各种限制,使它的价格优势成为鸡肋。*AE们就好比100M共享带宽的小区宽带,以低价卖给每个上网用户5M的带宽,前几十个用户感觉这网速真不错,等他卖了100个以上用户5M带宽,而这部分用户白天上班去了,晚上下班回来都在上网,其中又有一部分看视频、BT下载,于是乎,白天网速快,晚上慢得要死,连200K带宽都达不到。要知道,不怕神一样的对手,就怕猪一样的队友,在国内的 App Engine 环境下,水平参差不齐的开发者的代码质量、习惯性的资源滥用、别人网站被攻击殃及池鱼对*AE性能的影响,导致*AE的稳定性非常差。
2、所以,*AE们也意识到公共 App Engine 不稳定,所以又推出专用 App Engine,但费用一下就翻了很多倍。所以,*AE只是个人博客、个人开发者玩玩的工具,真正用作项目,还是需谨慎。根据实际的经验,*AE们还真不如VPS稳定。
二、成本低的小而美VPS
1、对于初创团队来说,购买服务器、交换机,托管服务器费用、带宽月使用费,是极其昂贵的。购买可以弹性升级硬件配置的云服务VPS,是降低成本不错的选择。国内VPS,1G内存、1~2核CPU、1M带宽、多线BGP,大概价格在100元/月左右,支持备案,可以作为最低入门选择,有条件可以购买两台互为热备,阿里云主机可以作为参考。大多数VPS服务商使用的都是廉价的SATA磁盘。如果你对磁盘IO要求较高,可以选择提供有SAS磁盘的IAAS云主机服务商,比如UCloud。
2、市场上的VPS商家主要有 Xen、OpenVZ、KVM 三种开源的虚拟化技术。全虚拟化的 Xen 更像独立主机,服务器资源按VPS实际大小平均分配,一般无法超售。半虚拟化的 OpenVZ 在同样的性能测试下,会比 Xen 高一些,但是,一台物理内存16G的服务器,可以分配出总内存大小超过16G很多倍的VPS,服务商可以超售,想卖多少台VPS就可以卖多少台,所以不推荐使用。KVM 在最新的 Linux 发行版中,已经是集成,但是,商业化应用还不成熟,基于 KVM 的 VPS 服务商很少。
3、VPS的操作系统,建议选择64位的Linux。在32位Linux下,PHP能给处理的整数不能超过正负2^31=2147483648,如果以后接入新浪微博、淘宝、腾讯等第三方开放平台,他们的接口里会有超过32位的整数(比如新浪用户ID、淘宝商品ID)。如果不幸使用32位Linux,你只能将这些整数当成字符串处理了,以后配合Sphinx等搜索引擎,会非常麻烦。
4、现在,可以在北京进行备案的域名有:国际域名 .com .net .org,国内域名 .cn .com.cn .中国,国别域名 .cc,其他的域名均不能进行备案。仅北京有限制,其它省市正常提交备案即可。我们原来申请的 .me 域名,在北京无法备案,后来只好拿到苏州去备案了。所以,在选择域名的时候,需要慎重。
5、使用 VPS,一定要定期在本地,做好数据备份,不要相信所谓的 7*24服务,99.99%安全稳定性,只要有人的VPS出问题了,都归为那 0.01%。
三、应对峰值带宽的云存储
1、对于DAU(日活跃用户)过十万的网站、APP应用来说,CDN或云存储是必需品。使用云存储不是因为存储空间,因为一块几TB的SATA磁盘很便宜,使用云存储是因为高出平均带宽值几倍至几十倍的峰值带宽。做手机APP应用,峰值带宽更集中,当你向所有用户群发PUSH一条消息,用户被唤醒打开APP应用,几分钟的时间,会消耗几十倍的带宽峰值。图片、下载,是最主要的带宽消耗者。也许,数据接口API只需不到1M的带宽,而图片对带宽的峰值需求则会达到100M。为了几分钟的峰值,去购买100M昂贵的带宽,其他时间带宽都空闲,是一件非常奢侈的事。
2、国内提供云存储服务的商家有很多,真正好用得却不多,提供FTP等公共通用协议的云存储更是微乎其微。使用第三方云服务,切忌千万不要吊死在一棵树上。支持FTP等公共协议,如果将来有问题,能够方便的进行数据迁移和技术替代。如果云服务厂商一直能够提供优质的服务,那么,也就可以长期使用他们的云服务。相信优秀的云存储提供商,是不会惧怕这一点的。
ASIHTTPRequest 类库在 iOS 7.0 中需要修改的地方
[ 2013-10-6 13:34 | by 张宴 ]
ASIHTTPRequest 类库在iOS 7.0中,会有一些报错警告,需要稍作修改:
1、
修改成:
2、
修改成:
1、
if ([inputStream streamStatus] == NSStreamEventErrorOccurred) {
修改成:
if ([inputStream streamStatus] == (NSStreamStatus)NSStreamEventErrorOccurred) {
2、
return [[NSDate date] addTimeInterval:maxAge];
修改成:
return [[NSDate date] dateByAddingTimeInterval:maxAge];
Nginx 1.5.2 + PHP 5.5.1 + MySQL 5.6.10 在 CentOS 下的编译安装
[ 2013-5-29 11:53 | by 张宴 ]
最近配置了几台Web服务器,将安装笔记贴出来吧。没时间像以前那样,将文章写的那样系统了,请见谅。详细配置,可以看以前的旧文章:
http://blog.zyan.cc/nginx_php_v6
1、安装Nginx:
http://blog.zyan.cc/nginx_php_v6
1、安装Nginx:
mkdir -p /Data/tgz
cd /Data/tgz
yum install wget
yum install pcre
yum install openssl*
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make
yum -y install gd gd2 gd-devel gd2-devel
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
ulimit -SHn 65535
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.32.tar.gz
tar zxvf pcre-8.32.tar.gz
cd pcre-8.32
./configure --prefix=/Data/apps/pcre
make && make install
cd ../
wget http://nginx.org/download/nginx-1.5.2.tar.gz
tar zxvf nginx-1.5.2.tar.gz
cd nginx-1.5.2
./configure --user=www --group=www --prefix=/Data/apps/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/Data/tgz/pcre-8.32 --with-http_realip_module --with-http_image_filter_module
make
make install
cd ../
cd /Data/tgz
yum install wget
yum install pcre
yum install openssl*
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make
yum -y install gd gd2 gd-devel gd2-devel
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
ulimit -SHn 65535
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.32.tar.gz
tar zxvf pcre-8.32.tar.gz
cd pcre-8.32
./configure --prefix=/Data/apps/pcre
make && make install
cd ../
wget http://nginx.org/download/nginx-1.5.2.tar.gz
tar zxvf nginx-1.5.2.tar.gz
cd nginx-1.5.2
./configure --user=www --group=www --prefix=/Data/apps/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/Data/tgz/pcre-8.32 --with-http_realip_module --with-http_image_filter_module
make
make install
cd ../
手机电商APP的智能化设计
[ 2013-5-21 13:11 | by 张宴 ]
5月17日,我在苏州工业园区“2013首届金鸡湖云产业高峰论坛”上的演讲PPT:《手机电商APP的智能化设计》下载。
http://pan.baidu.com/share/link?shareid=560014&uk=3946315320&third=2
昨晚开始,我博客在国外的256M内存小VPS,遭到大量IP的CC攻击,带宽被占满,机房为了保证其他VPS的正常访问,对我的VPS访问进行了限制。没办法,只好用几KB/秒的速度,将未备份的几百兆数据迁移回来(幸好内容未变动的几个G数据,本地已经有备份)。因为域名未备案,于是放在了家中的北京联通ADSL + cubieboard 上,恢复了服务。2M的ADSL,上行只有512K带宽,速度会慢点,等有时间了,将图片、文件放在别的地方。
iPhone大小的盒子服务器Cubieboard
[ 2013-3-25 15:57 | by 张宴 ]
在淘宝上350多元,买了个基于ARM平台的超小电脑 cubieboard,配置如下:
1G ARM cortex-A8 processor, NEON, VFPv3, 256KB L2 cache
Mali400, OpenGL ES GPU
512M/1GB DDR3 @480MHz
HDMI 1080p Output
10/100M Ethernet
4GB Nand Flash
2 USB Host, 1 micro SD slot, 1 SATA, 1 ir
96 extend pin including I2C, SPI, RGB/LVDS, CSI/TS, FM-IN, ADC, CVBS, VGA, SPDIF-OUT, R-TP..
Running Android, Ubuntu and other Linux distributions
找了台支持HDMI的显示器,安装了Ubuntu Linaro,然后很方便的安装了SSH Server、VNC Server、Nginx、PHP 5.3、MySQL 5.5:
C/C++的开发环境安装:
1G ARM cortex-A8 processor, NEON, VFPv3, 256KB L2 cache
Mali400, OpenGL ES GPU
512M/1GB DDR3 @480MHz
HDMI 1080p Output
10/100M Ethernet
4GB Nand Flash
2 USB Host, 1 micro SD slot, 1 SATA, 1 ir
96 extend pin including I2C, SPI, RGB/LVDS, CSI/TS, FM-IN, ADC, CVBS, VGA, SPDIF-OUT, R-TP..
Running Android, Ubuntu and other Linux distributions
找了台支持HDMI的显示器,安装了Ubuntu Linaro,然后很方便的安装了SSH Server、VNC Server、Nginx、PHP 5.3、MySQL 5.5:
apt-get install openssh-server
apt-get install vnc-server
apt-get install mysql-server mysql-client
apt-get install nginx
apt-get install php5-fpm
apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
apt-get install vnc-server
apt-get install mysql-server mysql-client
apt-get install nginx
apt-get install php5-fpm
apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
C/C++的开发环境安装:
apt-get install gcc
apt-get install g++
apt-get install cmake
apt-get install make
apt-get install g++
apt-get install cmake
apt-get install make
iOS XCode 多人共享开发 SVN 配置需要做的小设置
[ 2012-12-13 13:04 | by 张宴 ]
UserInterfaceState.xcuserstate 文件频繁更新,*.a等静态链接库文件默认不被添加到 SVN 中,需要对自己 Mac OS 上的 SVN 客户端配置做一下修改。
进入终端:
查找 [miscellany] 字段
在默认被注释的 global-ignores 下一行,增加一行:
进入终端:
vi ~/.subversion/config
查找 [miscellany] 字段
在默认被注释的 global-ignores 下一行,增加一行:
global-ignores = *~ #*# .#* .*.swp .DS_Store .xcuserstate
禁用 UIWebView 里面的链接长按弹出效果
[ 2012-9-24 19:14 | by 张宴 ]
苹果一直拒绝 UIWebView 内嵌 HTML5 页面的 iPhone、iPad APP应用上架到 App Store,建议这样的APP去做成Safari的Web应用。但是,苹果的审核人员只从界面、URL去判断是否HTML5的。有一次,一个 APP应用的URL地址被他们拷贝出来,放到浏览器中能够访问,然后,应用悲催地被拒绝上架了。
对付方法:
1、URL不让直接通过浏览器访问(UIWebView的请求Header头中加点东西,在服务器端将APP内嵌的访问和通过直接浏览器访问区分开来),或者通过浏览器访问时,返回JSON、XML信息,输出“Interface Error”,忽悠苹果审核人员说这是HTTP协议的接口,不是网页。
2、禁用、禁止 UIWebView 里面的链接长按弹出效果。加入一行 CSS 代码,禁用类似下图的链接长按弹出效果:
对付方法:
1、URL不让直接通过浏览器访问(UIWebView的请求Header头中加点东西,在服务器端将APP内嵌的访问和通过直接浏览器访问区分开来),或者通过浏览器访问时,返回JSON、XML信息,输出“Interface Error”,忽悠苹果审核人员说这是HTTP协议的接口,不是网页。
2、禁用、禁止 UIWebView 里面的链接长按弹出效果。加入一行 CSS 代码,禁用类似下图的链接长按弹出效果:
html,body{-webkit-touch-callout: none;}
一些数据:移动iPhone用户超联通两倍,Android用户小米手机占有率第一
[ 2012-2-23 13:24 | by 张宴 ]
[文章作者:张宴 本文版本:v1.0 最后修改:2012.02.23 转载请注明原文链接:http://blog.zyan.cc/android_ios_status/]
上周,我们发布了一款支持 Android 和 iOS 平台手机应用。本周,又发布了另一款手机应用的 iOS 版本。纵贯两款应用的统计数据,发现有两点出乎我的意料。
1、iOS 应用状况:移动iPhone用户超联通两倍,WIFI 联网方式接近 75%
我曾经一直以为在 iPhone 4/4S 用户中,中国联通的用户要比中国移动多,毕竟联通是苹果合作伙伴,联通卡是3G网络,而移动卡的国产TD-SCDMA iPhone不支持,只能使用2G网络。但经过最近一星期发布的两款手机应用(均有 iOS、Android 版本)的统计数据发现,iPhone 里插着中国移动2G卡的用户比中国联通3G用户多两倍。因此,将来针对移动互联网 IDC 机房的选择与优化,也需要偏向中国移动网络。
2、Android 应用状况:小米手机占有率领先,WIFI 联网方式超过 80%
Android 用户移动远超联通,在预料之中。但是,没有想到,在这么多不同型号的 Android 手机中,小米手机 MI-ONE Plus 的占有量竟然能够位居第一,而三星 GT-I9100 紧跟其后。
上周,我们发布了一款支持 Android 和 iOS 平台手机应用。本周,又发布了另一款手机应用的 iOS 版本。纵贯两款应用的统计数据,发现有两点出乎我的意料。
1、iOS 应用状况:移动iPhone用户超联通两倍,WIFI 联网方式接近 75%
我曾经一直以为在 iPhone 4/4S 用户中,中国联通的用户要比中国移动多,毕竟联通是苹果合作伙伴,联通卡是3G网络,而移动卡的国产TD-SCDMA iPhone不支持,只能使用2G网络。但经过最近一星期发布的两款手机应用(均有 iOS、Android 版本)的统计数据发现,iPhone 里插着中国移动2G卡的用户比中国联通3G用户多两倍。因此,将来针对移动互联网 IDC 机房的选择与优化,也需要偏向中国移动网络。
2、Android 应用状况:小米手机占有率领先,WIFI 联网方式超过 80%
Android 用户移动远超联通,在预料之中。但是,没有想到,在这么多不同型号的 Android 手机中,小米手机 MI-ONE Plus 的占有量竟然能够位居第一,而三星 GT-I9100 紧跟其后。
根据淘宝商品 num_iid 批量生成淘宝客链接的 PHP 函数
[ 2012-2-16 14:08 | by 张宴 ]
[文章作者:张宴 本文版本:v1.0 最后修改:2012.02.16 转载请注明原文链接:http://blog.zyan.cc/taobaoke_click_urls/]
根据淘宝商品 num_iid 批量生成淘宝客(什么是淘宝客?)链接的 PHP 文件内容如下。
淘宝 API 有调用次数限制,一次 API 调用,可以最大返回40个商品的淘宝客链接,因此,在本函数内,如果需要批量生成的淘宝商品 num_iid 数大于40,将按照40个一次,分多次调用。如果调用淘宝 API 查询过的商品 num_iid,不管其是否有淘宝客链接(有些商品没有淘宝客推广链接),都将利用 Memcached 缓存起来,下次直接查缓存,不会重复调用淘宝 API。
淘宝开放平台(http://open.taobao.com/) PHP SDK 下载:
根据淘宝商品 num_iid 批量生成淘宝客(什么是淘宝客?)链接的 PHP 文件内容如下。
淘宝 API 有调用次数限制,一次 API 调用,可以最大返回40个商品的淘宝客链接,因此,在本函数内,如果需要批量生成的淘宝商品 num_iid 数大于40,将按照40个一次,分多次调用。如果调用淘宝 API 查询过的商品 num_iid,不管其是否有淘宝客链接(有些商品没有淘宝客推广链接),都将利用 Memcached 缓存起来,下次直接查缓存,不会重复调用淘宝 API。
<?php
require_once(dirname(__FILE__).'/TopSdk.php'); //引用淘宝开放平台 API SDK
function object2Array($d)
{
if (is_object($d))
{
$d = get_object_vars($d);
}
if (is_array($d))
{
return array_map(__FUNCTION__, $d);
}
else
{
return $d;
}
}
/*********************************************
* 函数名:get_taobaoke_link ($num_iids)
* 函数用途:通过淘宝商品 num_iids 获取其对应的淘宝客手机版链接
* 创建时间:2012-02-14
* 创建人:张宴 net@zyan.cc
* 参数说明:
* $num_iids 淘宝商品ID(支持多个商品)数组,示例如下:
* $num_iids[] = "13583512568";
* $num_iids[] = "10809380078";
* $num_iids[] = "10809380079";
* 返回值:
* 下标为淘宝商品 num_iid ,值为淘宝客链接 click_url 的二维数组。如果无淘宝客链接,click_url 为空字符串,示例如下:
* array(3) {
* ["13583512568"]=>
* string(191) "http://auction1.wap.taobao.com/auction/item_detail-0db2-13583512568.jhtml?tks=jUTwPLMDtUUNEZhqfEuTZqkZhGw1LA7%2BzCJBXCj27NpurHxjZN70Amg0DVaFU61pfnHwW%2FI4MZGm%0Awgb69kbb1NL8uwtu%2BDnyAunBCVDP"
* ["10809380078"]=>
* string(187) "http://auction1.wap.taobao.com/auction/item_detail-0db2-10809380078.jhtml?tks=jUTwPLMDtUUNEGWhOOgVVuX%2BJKYt7fesyuZjEe7hvmpTJxYDfK8i1Wpvfl7lwI7nzD9W8M352v6E%0AyuUtsKun81AGltKzJWCYPiVDiOeC"
* ["10809380079"]=>
* string(0) ""
* }
*********************************************/
function get_taobaoke_link ($num_iids) {
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11911); //Memcached 缓存服务器地址
$click_urls = $memcache->get($num_iids);
foreach ($num_iids AS $num_iid) {
if (!isset($click_urls[$num_iid])) {
$tbapi_num_iids_arr[] = $num_iid;
}
}
if (!empty($tbapi_num_iids_arr)) {
$numbers = count($tbapi_num_iids_arr);
$numbers_max = 40; //淘宝 API 限制最大返回40条记录
if ($numbers > 0) {
$numbers_times = ceil($numbers / $numbers_max); //第一层循环的循环次数
$numbers_start = 0;
$numbers_end = $numbers_max;
for ($numbers_i = 1; $numbers_i <= $numbers_times; $numbers_i++) {
for ($numbers_j = $numbers_start; $numbers_j < $numbers_end; $numbers_j++) {
if ($numbers_j >= $numbers) {
break;
}
$tbapi_num_iids_arr_sp[] = $tbapi_num_iids_arr[$numbers_j];
}
$numbers_start = $numbers_start + $numbers_max;
$numbers_end = $numbers_end + $numbers_max;
$tbapi_num_iids = implode(",", $tbapi_num_iids_arr_sp);
$c = new TopClient;
$c->appkey = 12498835; //淘宝开放平台 API 接口 App Key
$c->secretKey = "745db5f8e316f9f1aa8310a7568d6566"; //淘宝开放平台 API 接口 App Secret
$c->format = "json";
$req = new TaobaokeItemsConvertRequest;
$req->setFields("num_iid,click_url");
$req->setNumIids($tbapi_num_iids);
$req->setPid(29509662); //淘宝联盟(阿里妈妈)PID
$req->setIsMobile("true"); //如果要生成手机页面的淘宝客链接,选择 true;网页版选择 false
$resp = $c->execute($req);
$res = object2Array($resp);
if (isset($res["taobaoke_items"]["taobaoke_item"])) {
$links = $res["taobaoke_items"]["taobaoke_item"];
foreach ($links as $value) {
$memcache->set($value["num_iid"], $value["click_url"], MEMCACHE_COMPRESSED, 0);
$click_urls[(string)$value["num_iid"]] = $value["click_url"];
}
}
unset($tbapi_num_iids_arr_sp);
unset($tbapi_num_iids);
unset($resp);
unset($res);
unset($links);
unset($value);
}
}
}
foreach ($num_iids AS $num_iid) {
if (!isset($click_urls[$num_iid])) {
$memcache->set($num_iid, "", MEMCACHE_COMPRESSED, 0);
$click_urls[(string)$num_iid] = "";
}
}
$memcache->close();
return $click_urls;
}
//演示
$num_iids[] = "13583512568";
$num_iids[] = "10809380078";
$num_iids[] = "10809380079";
$click_urls = get_taobaoke_link ($num_iids);
var_dump($click_urls);
?>
require_once(dirname(__FILE__).'/TopSdk.php'); //引用淘宝开放平台 API SDK
function object2Array($d)
{
if (is_object($d))
{
$d = get_object_vars($d);
}
if (is_array($d))
{
return array_map(__FUNCTION__, $d);
}
else
{
return $d;
}
}
/*********************************************
* 函数名:get_taobaoke_link ($num_iids)
* 函数用途:通过淘宝商品 num_iids 获取其对应的淘宝客手机版链接
* 创建时间:2012-02-14
* 创建人:张宴 net@zyan.cc
* 参数说明:
* $num_iids 淘宝商品ID(支持多个商品)数组,示例如下:
* $num_iids[] = "13583512568";
* $num_iids[] = "10809380078";
* $num_iids[] = "10809380079";
* 返回值:
* 下标为淘宝商品 num_iid ,值为淘宝客链接 click_url 的二维数组。如果无淘宝客链接,click_url 为空字符串,示例如下:
* array(3) {
* ["13583512568"]=>
* string(191) "http://auction1.wap.taobao.com/auction/item_detail-0db2-13583512568.jhtml?tks=jUTwPLMDtUUNEZhqfEuTZqkZhGw1LA7%2BzCJBXCj27NpurHxjZN70Amg0DVaFU61pfnHwW%2FI4MZGm%0Awgb69kbb1NL8uwtu%2BDnyAunBCVDP"
* ["10809380078"]=>
* string(187) "http://auction1.wap.taobao.com/auction/item_detail-0db2-10809380078.jhtml?tks=jUTwPLMDtUUNEGWhOOgVVuX%2BJKYt7fesyuZjEe7hvmpTJxYDfK8i1Wpvfl7lwI7nzD9W8M352v6E%0AyuUtsKun81AGltKzJWCYPiVDiOeC"
* ["10809380079"]=>
* string(0) ""
* }
*********************************************/
function get_taobaoke_link ($num_iids) {
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11911); //Memcached 缓存服务器地址
$click_urls = $memcache->get($num_iids);
foreach ($num_iids AS $num_iid) {
if (!isset($click_urls[$num_iid])) {
$tbapi_num_iids_arr[] = $num_iid;
}
}
if (!empty($tbapi_num_iids_arr)) {
$numbers = count($tbapi_num_iids_arr);
$numbers_max = 40; //淘宝 API 限制最大返回40条记录
if ($numbers > 0) {
$numbers_times = ceil($numbers / $numbers_max); //第一层循环的循环次数
$numbers_start = 0;
$numbers_end = $numbers_max;
for ($numbers_i = 1; $numbers_i <= $numbers_times; $numbers_i++) {
for ($numbers_j = $numbers_start; $numbers_j < $numbers_end; $numbers_j++) {
if ($numbers_j >= $numbers) {
break;
}
$tbapi_num_iids_arr_sp[] = $tbapi_num_iids_arr[$numbers_j];
}
$numbers_start = $numbers_start + $numbers_max;
$numbers_end = $numbers_end + $numbers_max;
$tbapi_num_iids = implode(",", $tbapi_num_iids_arr_sp);
$c = new TopClient;
$c->appkey = 12498835; //淘宝开放平台 API 接口 App Key
$c->secretKey = "745db5f8e316f9f1aa8310a7568d6566"; //淘宝开放平台 API 接口 App Secret
$c->format = "json";
$req = new TaobaokeItemsConvertRequest;
$req->setFields("num_iid,click_url");
$req->setNumIids($tbapi_num_iids);
$req->setPid(29509662); //淘宝联盟(阿里妈妈)PID
$req->setIsMobile("true"); //如果要生成手机页面的淘宝客链接,选择 true;网页版选择 false
$resp = $c->execute($req);
$res = object2Array($resp);
if (isset($res["taobaoke_items"]["taobaoke_item"])) {
$links = $res["taobaoke_items"]["taobaoke_item"];
foreach ($links as $value) {
$memcache->set($value["num_iid"], $value["click_url"], MEMCACHE_COMPRESSED, 0);
$click_urls[(string)$value["num_iid"]] = $value["click_url"];
}
}
unset($tbapi_num_iids_arr_sp);
unset($tbapi_num_iids);
unset($resp);
unset($res);
unset($links);
unset($value);
}
}
}
foreach ($num_iids AS $num_iid) {
if (!isset($click_urls[$num_iid])) {
$memcache->set($num_iid, "", MEMCACHE_COMPRESSED, 0);
$click_urls[(string)$num_iid] = "";
}
}
$memcache->close();
return $click_urls;
}
//演示
$num_iids[] = "13583512568";
$num_iids[] = "10809380078";
$num_iids[] = "10809380079";
$click_urls = get_taobaoke_link ($num_iids);
var_dump($click_urls);
?>
淘宝开放平台(http://open.taobao.com/) PHP SDK 下载:
越狱的 iPhone、iPad 通过网站实现一键安装 ipa 格式的 APP 应用
[ 2012-2-13 13:50 | by 张宴 ]
1、已经越狱的 iPhone、iPad 设备,当通过其自带的 safari 浏览器访问 ipa 应用下载网站时,利用 itms-services 协议,可以一键安装 ipa 文件的 iOS 应用,例如:
2、jhsmyt.plist 的内容如下:
blog.zyan.cc/demo/ios/jhsmyt.plist
需要修改之处:
3、如果通过 iPhone、iPad 上的二维码扫描软件,还可以实现类似 Android 系统的扫描二维码下载 app 应用:
二维码内的网址地址为 http://blog.zyan.cc/demo/ios/autodown.htm 内容如下:
4、完整的 Demo 示例:
http://blog.zyan.cc/demo/ios/
<a href="itms-services://?action=download-manifest&url=http://blog.zyan.cc/demo/ios/jhsmyt.plist">通过越狱的iOS设备浏览器访问本页,点这儿一键安装APP应用。</a>
2、jhsmyt.plist 的内容如下:
blog.zyan.cc/demo/ios/jhsmyt.plist
需要修改之处:
3、如果通过 iPhone、iPad 上的二维码扫描软件,还可以实现类似 Android 系统的扫描二维码下载 app 应用:
二维码内的网址地址为 http://blog.zyan.cc/demo/ios/autodown.htm 内容如下:
4、完整的 Demo 示例:
http://blog.zyan.cc/demo/ios/