Lua基础学习

1:Lua简单介绍

         Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean C ,指的 ANSI C 和 C++ 中共通的一个子集)

        作为一个扩展式语言,Lua 没有 “main” 程序的概念:它只能 嵌入 一个宿主程序中工作,这个宿主程序被称作 embedding program 或简称为 host 。宿主程序可以通过调用函数执行一小段 Lua 代码,可以读写 Lua 变量,可以注入 C 函数让 Lua 代码调用。这些扩展的 C 函数,可以大大的扩展了 Lua 可以处理事务的领域,这样就可以订制出各种语言,而它们共享一个统一的句法格式的框架。Lua 的官方发布版就包含了一个叫做lua的简单的宿主程序,它用 Lua 库提供了一个保证独立的 Lua 解释器.

        Lua非常高效,它运行得比许多其它脚本(如Perl、Python、Ruby)都快,这点在第三方的独立测评中得到了证实。尽管如此,仍然会有人不满足,他们总觉得“嗯,还不够快!”。
LuaJIT 就是一个为了再榨出一些速度的尝试,它利用即时编译(Just-in Time)技术把 Lua 代码编译成本地机器码后交由 CPU 直接执行。LuaJIT 2 的测评报告表明,在数值运算、循环与函数调用、协程切换、字符串操作等许多方面它的加速效果都很显著。凭借着 FFI 特性,LuaJIT 2 在那些需要频繁地调用外部 C/C++ 代码的场景,也要比标准 Lua 解释器快很多。目前 LuaJIT 2 已经支持包括 i386、x86_64、ARM、PowerPC 以及 MIPS 等多种不同的体系结构。

        LuaJIT 是采用 C 和汇编语言编写的 Lua 解释器与即时编译器。LuaJIT 被设计成全兼容标准的 Lua 5.1 语言,同时可选地支持 Lua 5.2 和 Lua 5.3 中的一些不破坏向后兼容性的有用特性。因此,标准 Lua 语言的代码可以不加修改地运行在 LuaJIT 之上。LuaJIT 和标准 Lua 解释器的一大区别是,LuaJIT 的执行速度,即使是其汇编编写的 Lua 解释器,也要比标准 Lua 5.1 解释器快很多,可以说是一个高效的 Lua 实现。另一个区别是,LuaJIT 支持比标准 Lua 5.1 语言更多的基本原语和特性,因此功能上也要更加强大

     大家可以去http://luajit.org/download.htmlhttp://www.lua.org/download.html去配置自己的lua运行环境

    想学习lua的可以看如下的教程

    OpenResty最佳实践 

    Lua简明教程 | 酷 壳 – CoolShell.cn

    Lua 5.3 参考手册

    Lua 5.1 参考手册

2:HelloWorld简单程序

   helloworld.lua

print("Hello World")

  直接在命令行用lua或luajit运行

lua helloworld.lua
luajit helloworld.lua

也可以把HelloWorld修改如下当作shell一样运行

#!/usr/local/bin/lua
print("Hello World")

3:语法

   
    注释

    

--两个减号是单行注释

--[[
这是块注释
这是块注释
--]]

  

简单 数据类型

 

print(type("hello world")) -->output:string
print(type(print))         -->output:function
print(type(true))          -->output:boolean
print(type(360.0))         -->output:number
print(type(nil))           -->output:nil

    
string(字符串)有三种表示法
1:使用一对匹配的单引号。例:’test’
2:使用一对匹配的双引号。例:”test”
3:字符串还可以用一种长括号(即[[ ]])括起来的方式定义

在Lua中,函数也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值

local function foo()
    print("in the function")
    --dosomething()
    local x = 10
    local y = 20
    return x + y
end

local a = foo    --把函数赋给变量

print(a())

--output:
in the function
30

boolean(布尔)
布尔类型,可选值true/false;Lua 中 nil 和 false 为“假”,其它所有值均为“真”。比如 0 和空字符串就是“真”;好多人会对此感到惊讶

number(数字)
Number 类型用于表示实数,和 C/C++ 里面的 double 类型很类似。可以使用数学函数 math.floor(向下取整)和 math.ceil(向上取整)进行取整操作

nil(空)
nil是一种类型,Lua将nil用于表示“无效值”。一个变量在第一次赋值前的默认值是nil,将nil赋予给一个全局变量就等同于删除它

表达式中值的注意的地方

Lua 语言中“不等于”运算符的写法为:~=
Lua 中的 and 和 or 是不同于 c 语言的。在 c 语言中,and 和 or 只得到两个值 1 和 0,其中 1 表示真,0 表示假。而 Lua 中 and 的执行过程是这样的:
a and b 如果 a 为 nil,则返回 a,否则返回 b
a or b 如果 a 为 nil,则返回 b,否则返回
所有逻辑操作符将 false 和 nil 视作假,其他任何值视作真,对于 and 和 or,“短路求值”,对于not,永远只返回 true 或者 false
在Lua中连接两个字符串,可以使用操作符“..”(两个点)。如果其任意一个操作数是数字的话,Lua 会将这个数字转换成字符串
4:控制结构

 if-else
--单个if分支型
x = 8
if x > 0 then
    print("X大于0")
end

--两个分支: if-else 型
x = 8
if x > 0 then
    print("X大于0")
else
    print("X不大于)")
end

--多个分支: if-elseif-else型
score = 60
if score == 100 then
    print("满分")
elseif score >= 60 then
    print("及格以上")
elseif  score >= 30 then
    print("比较差")
else
    print("很差")
end

while型控制结构
x = 1
sum = 0

while x <= 10 do
    sum = sum + x
    x=x+1
end
print(sum)

for循环

--输出1到10
for i = 1 ,10 , 1 do
	print(i)
end

--便利table
local a = {"a", "b", "c", "d"}
for i, v in ipairs(a) do
  print("index:", i, " value:", v)
end

5:Lua函数

  函数的定义

  Lua 使用关键字function定义函数,语法如下

 

function function_name (arc)  --arc表示参数列表,函数的参数列表可以为空
   --content
end

 

 

上面的语法定义了一个全局函数,名为 function_name. 全局函数本质上就是函数类型的值赋给了一个全局变量,即上面的语法等价于

function_name = function (arc)
  --content
end

由于全局变量一般会污染全局名字空间,同时也有性能损耗(即查询全局环境表的开销),因此我们应当尽量使用“局部函数”,其记法是类似的, 只是开头加上 local 修饰符:

local function function_name (arc)  --arc表示参数列表,函数的参数列表可以为空
   --content
end

由于函数定义本质上就是变量赋值,而变量的定义总是应放置在变量使用之前,所以函数的定义也需要放置在函数调用之前

>Lua具有一项与众不同的特性,允许函数返回多个值。Lua的库函数中,有一些就是返回多个值,返回多个值时,值之间用“,”隔开

先到这儿吧,把lua基本的语法知识介绍完毕。大部份内容都参照了https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/main.html

发表在 好文推荐 | 标签为 | 18 条评论

centos系统下搭建selenium server结合php完成自动化网站测试和采集数据

selenium server 由于需要图形化界面,所以我们首先介绍vncserver的安装和配置


一. 安装gnome图形化桌面

    

yum group install -y "X Window System"
yum group install -y "Desktop"
yum group install -y "Chinese Support"

二. 安装vncserver并配置

    1.安装vncserver      

 yum install -y tigervnc-server

   2.配置vncserver

        1).配置为开机自启动        

    chkconfig --level 345 vncserver on

        2).配置vnc密码

           vncserver

          You will require a password to access your desktop.

          Password:

          Verify:

        3).配置为使用gnome桌面

            修改 /root/.vnc/xstartup文件,把最后的 twm & 删掉 加上 gnome-session &。

        4).配置vncserver启动后监听端口和环境参数

            修改/etc/sysconfig/vncservers 文件添加以下内容

            VNCSERVERS=”1:root”

            # 桌面号:用户    监听 590* 端口

            VNCSERVERARGS[1]=”-geometry 1200×800″

        5).重启vncserver服务

            #service vncserver restart


三. 允许root访问图形界面和生成新的machine-id

   

 sed -i 's/.*!= root.*/#&/' /etc/pam.d/gdm 
 dbus-uuidgen >/var/lib/dbus/machine-id

四. 关闭selinux和NetworkManager服务

     1.检查selinux服务并关闭

        #vi /etc/selinux/config

        确认里面的SELINUX字段的值是disabled,如果不是则改为disabled。

     2.关闭NetworkManager服务

        #chkconfig –del NetworkManager


五. 测试登录:cleint可在此下载

  

现在说安装selenium server


1:需要java的支持

    

yum -y install java

2:需要浏览器的支持,我们用frefox来做

yum -y install firefox


3:下载selenium server

wget http://selenium-release.storage.googleapis.com/2.48/selenium-server-standalone-2.48.2.jar


4:下载selenium server


java -jar selenium-server-standalone-2.48.2.jar -port 4444


最后,我们用PHP来通过selenium server来操纵firefox浏览.client库用的是https://code.google.com/p/php-webdriver-bindings/

代码示例:


require_once "phpwebdriver/WebDriver.php";
require("phpwebdriver/LocatorStrategy.php");

$webdriver = new WebDriver("localhost", "4444");
$webdriver->connect("firefox");                            
$webdriver->get("http://google.com");
$element = $webdriver->findElementBy(LocatorStrategy::name, "q");
$element->sendKeys(array("selenium google code" ) );
$element->submit();

$webdriver->close();


最后总结一下,这样我们可以通过他来自动化测试PC网站,或者模拟浏览器来采集一些比较难采集的数据,当然也可以做自动化网站的功能,这主要看大家的兴趣!

发表在 好文推荐 | 标签为 | 24 条评论

在分布式系统中用程序获取时间不一致的问题

        最近两天发现个奇怪的现象,我们表中的一些记录的更新时间竟然比创建时间还早。后来发现是各个主机系统时间不一致所导致的。虽然对目前我们这样的业务没有影响,但是对于电商,游戏的业务来说,那将是影响重大的。

       

        发现问题,那就好办了,一般同步有两个方法.

        用ntpdate从时间服务器更新时间

       

   yum install ntp 
   ntpdate time.nist.gov

   

      用ntp搭建自己的时间服务器

     

  yum install ntp 
  /etc/init.d/ntpd start 

 

    两都还是有些区别的,ntpdate是根据时间服务器直接修正本地时间,比较暴力。而nfpd属于慢慢纠正,这对一些线上业务还是比较友好的.不过,建议不要靠时间同步来解决这样的标准,正确的做法应该是根据场景来用正确的场景来获取时间。比如:都用mysql的时间方法等,这样才能保证时间的一致性!


发表在 好文推荐 | 16 条评论

php-fpm进程数和mysql连接数之间的关系

    先简单说下php-fpm的进程模式

    文件位置:/etc/php-fpm.d/www.conf,关键参数如下:

    

;进程模式  static 静态模式,固定启动max_children个进程 dynamic动态模式,根据情况增加或减少进程数量
pm = static/dynamic 
;静态模式下固定进程数 动态模式下最大进程数
pm.max_children = 1
;动态模式下,刚启动的时候启动的进程数 
pm.start_servers = 5
;动态模式下,空闲的最小进程数
pm.min_spare_servers = 2
;动态模式下,空闲的最大进程数 
pm.max_spare_servers = 8
;每个进程数,最多可处理多少次请求
pm.max_requests = 2

在对php-fpm进程了解的情况下,让我们开始步入正题.将php-fpm的配置修改如下:

pm = static
pm.max_children = 2
;pm.max_requests = 2

短连接数据库的程序:

    $link = mysql_connect('aaaa', 'aaa', 'aa');
    if (!$link) {
        die('Could not connect: ' . mysql_error());
    }
    sleep(10)
    echo "<br/>Connected successfully"; 

先通过浏览器,访问地址:http://localhost/,然后程序没执行完,查看数据库连接 ,就看到程序只占了一个连接,程序执行完,数据库的连接就释放了.

修改为长连接数据的程序:

    $link = mysql_pconnect('aaaa', 'aaa', 'aa');
    if (!$link) {
        die('Could not connect: ' . mysql_error());
    }
    sleep(10)
    echo "<br/>Connected successfully";

再通过浏览器,访问地址:http://localhost/,然后程序没执行完,查看数据库连接 ,就看到程序只占了一个连接,程序执行完,数据库的连接是没有释放的.那什么时候释放呢?当然是php-fpm重启的时候,如果配置了pm.max_requests.当处理完请求次数后,也会重启释放数据库的连接.

到这儿,所以如果你的程序如果用的是长连接,一定要控制好php-fpm的进程数,否则可能会导致数据库大量的sleep连接

发表在 好文推荐 | 标签为 , | 18 条评论

PHP处理emoji表情

    MYSQL 5.5 之前, UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区, BMP是从哪到哪,到http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters这里看,基本就是0000~FFFF这一区。 从MYSQL5.5开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集.

    utf8mb4兼容utf8,且比utf8能表示更多的字符

    在做手机app接口的时候,经常会收到emoji表情的内容,所以建议这么做:

    1:数据库统一为utf8mb4编码

    2:程序操作数据库之前,也要设置编码为utf8mb4

    3:如果用PHP开发的话,要注意PHP的版本(PHP5.3.3要用query(“set names utf8mb4“),高版本才可以用set_charset(“utf8mb4″))

    通过以上的方法,基本就可以解决emoji表情存储的问题!

   

发表在 网站开发 | 36 条评论

linux下的lvm使用

    许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份、删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要。
LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性
    LVM的基本组成块(building blocks)如下

  • 物理卷Physical volume (PV):可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file)。物理卷包括一个特殊的header,其余部分被切割为一块块物理区域(physical extents)
  • 卷组Volume group (VG):将一组物理卷收集为一个管理单元
  • 逻辑卷Logical volume (LV):虚拟分区,由物理区域(physical extents)组成
  • 物理区域Physical extent (PE):硬盘可供指派给逻辑卷的最小单位(通常为4MB)

优点

比起正常的硬盘分区管理,LVM更富于弹性:

  • 使用卷组(VG),使众多硬盘空间看起来像一个大硬盘。
  • 使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区。
  • 可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小。
  • 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。It does not depend on
    the position of the LV within VG, there is no need to ensure surrounding
    available space.
  • 可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作。LVM上的文件系统也需要重新调整大小,某些文件系统也支持这样的在线操作。
  • 无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上。
  • 允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小。

这些优点使得LVM对服务器的管理非常有用,对于桌面系统管理的帮助则没有那么显著,你需要根据实际情况进行取舍。

详细使用可参考以下文章

LVM详细说明

Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)

发表在 好文推荐, 网站架构 | 18 条评论

在win10编译php7的redis扩展,最终生成php_redis.dll

PHP7虽然仍未发布正式版本,不过好多开发者已经开始尝鲜,为以后切换到PHP7打基础了.

redis扩展,是大家经常用的,但支持php7的redis扩展还比较少,尤其找生成好的php_redis.dll更是困难。

现将生成好的php-7.0.0RC7版本下的php_redis.dll分享出来,以供win下开发者方便使用.  点此下载

如果有其他编译需求或者想交流的,可联系我!

发表在 福利分享, 网站开发 | 标签为 , | 14 条评论

PHP好玩的开发框架

整理了一些PHP好玩的框架,方便大家查看!

1:Swoole http://www.swoole.com/

    PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网、车联网、智能家居等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品.

2:Workerman http://www.workerman.net/

    workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等.

    workerman的目标是让PHP开发者更容易的开发出基于socket的高性能的应用服务,而不用去了解PHP socket以及PHP多进程细节。
workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行.

3:PHPDaemon  http://daemon.io/

    phpdaemon 是 PHP 异步框架,使用 libevent 实现,它拥有很多特性。为应对高负载而设计。每一个worker可以处理上千个并发连接

4:reactphp   http://reactphp.org/

    ReactPHP作为Node.js的PHP版本。在实现思路,使用方法,应用场景上的确有很多相似之处。但是ReactPHP毕竟比Node.js年轻,目前生态圈还是不如Node.js完善。目前文档也不是很完善,在国内应用也比较少。但是相信,它会越来越完善,应用越来越广

5:phalcon    https://www.phalconphp.com

    Phalcon 是开源、全功能栈、使用 C 扩展编写、针对高性能优化的 PHP 5 框架。 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式暴露出来,可以直接使用。 Phalcon 也是松耦合的,可以根据项目的需要任意使用其他对象

6:Yaf   http://www.laruence.com/manual/

    Yaf是一个C语言编写的PHP框架,作者是大名鼎鼎的鸟哥.

7:Yar http://www.laruence.com/2012/09/15/2779.html

   Yar 是一个轻量级, 高效的RPC框架, 它提供了一种简单方法来让PHP项目之间可以互相远程调用对方的本地方法. 并且Yar也提供了并行调用的能力. 可以支持同时调用多个远程服务的方法

8:zephir   http://zephir-lang.com/

    Zephir提供了一种类似php的高级语言语法的方式,来自动生成扩展的c语言代码,使编写php扩展变得非常的简单

9:Ratchet    http://socketo.me/

    Ratchet是一个强大的PHP库,它允许开发人员通过Web接口创建介于客户端和服务器之间的实时双向应用程序。它包含了许多有用的组件,如Wamp服务器、Io服务器、会话提供程序、路由器、HTTP等

10:Php-cpp    http://www.php-cpp.com/

    PHP-CPP是一个用于开发PHP扩展的C++库。它提供了一套详实易用的类,用于开发PHP扩展。详细文档说明:http://www.php-cpp.com

11:Php-js    http://php-javascript.com/

   The powerful bridge between PHP and Javascript
   Execute JavaScript right from your PHP code and share variables between JavaScript and PHP

简单总结这些吧,有其他的欢迎大家补充!


发表在 好文推荐 | 评论关闭

inux下删除乱码文件名的方法

1.显示文件或目录  列出文件的索引编号inumber, 如: 1111

ls -i 

2. 删除文件

find ./ -inum 1111-print -exec rm -rf {} \; 

find -inum 1111-delete

小技巧,记录一下!

发表在 好文推荐 | 评论关闭

Linux 系统挂载数据盘

1、查看数据盘

在没有分区和格式化数据盘之前,使用 “df –h”命令,是无法看到数据盘的,可以使用“fdisk -l”命令查看

2、 对数据盘进行分区

执行“fdisk -S 56 /dev/xvdb”命令,对数据盘进行分区;

根据提示,依次输入“n”,“p”“1”,两次回车,“wq”,分区就开始了,很快就会完成

3、 查看新的分区

使用“fdisk -l”命令可以看到,新的分区xvdb1已经建立完成了

4、格式化新分区

以ext3为例:使用“mkfs.ext3 /dev/xvdb1”命令对新分区进行格式化,格式化的时间根据硬盘大小有所不同。

(也可自主决定选用其它文件格式,如ext4等)

  5、添加分区信息

使用“echo ‘/dev/xvdb1  /mnt ext3    defaults    0  0′ >> /etc/fstab”(不含引号)命令写入新分区信息。
然后使用“cat /etc/fstab”命令查看,出现以下信息就表示写入成功。

注:ubuntu12.04不支持barrier,所以正确写法是:echo ‘/dev/xvdb1  /mnt ext3    barrier=0  0  0′ >> /etc/fstab

*  如果需要把数据盘单独挂载到某个文件夹,比如单独用来存放网页,可以修改以上命令中的/mnt部分

6、挂载新分区

使用“mount -a”命令挂载新分区,然后用“df -h”命令查看,出现以下信息就说明挂载成功,可以开始使用新的分区了

以上文章转载自:http://help.aliyun.com/knowledge_detail/5974154.html?spm=5176.789005859.2.5.jhjRg6

发表在 好文推荐, 网站架构 | 30 条评论