Site error: the file D:\wwwroot\jcmjweb\wwwroot\includes\cls_smtp.php requires the ionCube PHP Loader ioncube_loader_win_5.2.dll to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.

ionCube出错问题

出错:

Site error: the file D:\php\webApp\ots\index.php requires the ionCube PHP Loader ioncube_loader_win_5.3.dll to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.

解决方法:

1、登陆http://www.ioncube.com/loaders.php,下载正确版本的程序,这里我选择的是Windows VC6 (x86)的ZIP文件ioncube_loaders_win_vc6_x86.zip(1.13 MB)

 

2、解压缩至你的PHP安装目录的EXT,我是安装在E盘的PHP文件夹下,如下图:

3、打开你的PHP.INI文件,在[ZEND]里最前面添加如下行

zend_extension = “D:\php\ioncube\ioncube_loader_win_5.3.dll”

 

 

3、第1、2步是本地的方法来的,如果不是本地,下面的方法。

 

 

1.Download one of the following archives of Windows VC9 x86 Loaders:

2.Put the Loader files in D:\php\ioncube

3.Edit the file D:\php\php.ini and before any other zend_extension lines ensure that the following is included:

zend_extension = “D:\php\ioncube\ioncube_loader_win_5.3.dll”

Alternatively, replace your current D:\php\php.ini file with this new php.ini file.

4.Restart the Apache server software.

5.When the server software has restarted, click here to test the Loader

转自http://www.myexception.cn/internet/1304941.html

php文件hash算法,秒传原理 哈希值


header('Content-type:text/html;Charset=UTF-8');

define('blockSize', 4*1024*1024);

var_dump(fileHash('test.wmv'));
var_dump(fileHash('asdf.wmv'));

function fileHash($file)
{
$f = fopen($file, "r");
if (!$f) exit("open $file error");

$fileSize = filesize($file);
$buffer = '';
$sha = '';
// 一共有多少分片
$blkcnt = $fileSize/blockSize;
if ($fileSize % blockSize) $blkcnt += 1;
// 把数据装入一个二进制字符串
$buffer .= pack("L", $blkcnt);
if ($fileSize <= blockSize) {
$content = fread($f, blockSize);
if (!$content) {
fclose($f);
exit("read file error");
}
$sha .= sha1($content, TRUE);
} else {
for($i=0; $i<$blkcnt; $i+=1) {
$content = fread($f, blockSize);
if (!$content) {
if (feof($f)) break;
fclose($f);
exit("read file error");
}
$sha .= sha1($content, TRUE);
}
$sha = sha1($sha, TRUE);
}
$buffer .= $sha;
$hash = urlSafeEncode(base64_encode($buffer));
fclose($f);
return array($hash, null);
}

function urlSafeEncode($data)
{
$find = array('+', '/');
$replace = array('-', '_');
return str_replace($find, $replace, $data);
}

php 数据库操作类 php,mysql,数据库,操作类


<?php
define("tabfix","ecs_");
class connection
{
private $server="127.0.0.1";
private $name="root";
private $pwd='root';
private $db="jcmjweb";
//当实例化时,打开数据连接
function __construct()
{
//1.连接数据库服务器
$con=mysql_connect($this->server,$this->name,$this->pwd) or die("服务器连接失败");

//2.选择一个数据库使用
mysql_select_db($this->db) or die("使用数据库失败");

}
//查询方法 返回结果集
function Query(&$str)
{
mysql_query("set names utf8");
mysql_query($str);
return mysql_insert_id();
}

//插入数据
function __call($name,$array)
{
die("你调用了一个不存在的方法");
}
function QueryArray(&$str)
{
mysql_query("set names utf8");
$result=mysql_query($str);
while($row=mysql_fetch_array($result))
{
$queryarray[]=$row;
}
return $queryarray;
}

function QueryCount(&$str)
{
mysql_query("set names utf8");
$result=mysql_query($str);
return mysql_num_rows($result);

}









}


?>

源生php 实现下拉加载 ajax 下拉加载

 

page.php


<?php
$conn=@mysql_connect("127.0.0.1","root","lzgabc123") or die("数据链接出错");
mysql_select_db("ghgl",$conn);
mysql_query("set names 'utf8'");
?>


 <script>
 function daojishi(id) {
 var t = Math.floor($("#" + id).attr('rel'));
 t--;
 var d = Math.floor(t / 60 / 60 / 24);
 var h = Math.floor(t / 60 / 60 % 24);
 var m = Math.floor(t / 60 % 60);
 var s = Math.floor(t % 60);
 if (d < 10) {
 d = '0' + d;
 }
 if (h < 10) {
 h = '0' + h;
 }
 if (m < 10) {
 m = '0' + m;
 }
 if (s < 10) {
 s = '0' + s;
 }
 $("#" + id).attr('rel', t);
 $("#" + id).html(d + ':' + h + ':' + m + ':' + s);
 }
</script>
<?php
require "conn.php";
$maxnum = 20; //每页记录条数
$sql_count = "SELECT COUNT(*) AS count FROM xy_cust";
$result=mysql_query($sql_count);
if($result)
{
 $row1 = mysql_fetch_assoc($result);
 $totalRows1 = $row1['count']; //数据集总条数
 $totalpages = ceil($totalRows1/$maxnum);//分页总数

 if(!isset($_GET['page']) || !intval($_GET['page']) || $_GET['page'] > $totalpages) $page = 1; //对3种出错进行处理 
 //在url参数page不存在时,page不为10进制数时,page大于可分页数时,默认为1 
 else $page = $_GET['page']; 
 $startnum = ($page - 1)*$maxnum; //从数据集第$startnum条开始读取记录,这里的数据集是从0开始的 
 $query = "SELECT * FROM xy_cust LIMIT $startnum,$maxnum";//选择出符合要求的数据 从$startnum条数据开始,选出$maxnum行 
 $result = mysql_query($query) or die(mysql_error()); 
 
 while ($row = mysql_fetch_array($result)) {
$xm=$row['xingming'];
$title=$row['title'];

$content=<<< content
<p style='height:66px;font-size:50px;'>{$xm}{$title}</p>
content;
echo $content;
 }
}


?>


 

index.html 访问页面

 <!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script src="jquery.min.js"></script>
 <script>
 var niulock = 1;
 var niunum = 1;
 function loaddata(page, obj, sc) {
 var link = page.replace('0000', niunum);
 
 // showLoader('正在加载中....');

 $.get(link, function (data) {
 if (data != 0) {
 obj.append(data);
 }
 niulock = 0;
 // hideLoader();
 }, 'html');
 if (sc === true) {
 $(window).scroll(function () {
 var wh = $(window).scrollTop();
 var xh = $(document).height() - $(window).height() - 70;
 if (!niulock && wh >= xh ) {
 niulock = 1;
 niunum++;
 var link = page.replace('0000', niunum);
 // showLoader('正在加载中....');
 var timeout = setTimeout(function(){
 niulock = 0;
 // hideLoader();
 },5000);
 $.get(link, function (data) {
 if (data != 0) {
 if(timeout){ //清除定时器
 clearTimeout(timeout);
 timeout = null;
 }
 obj.append(data);
 }
 niulock = 0;
 // hideLoader();
 }, 'html');
 }
 });
 }
 }
 </script>
 <script>
 $(document).ready(function () {
 loaddata('page.php?page=0000',$("#content"), true);
 });
 </script>
</head>
<body>
<div id="content">
 
</div> 
</body>
</html>

PHP实现执行定时任务的几种思路详解

转:https://segmentfault.com/a/1190000002955509

PHP本身是没有定时功能的,PHP也不能多线程。PHP的定时任务功能必须通过和其他工具结合才能实现,例如WordPress内置了wp-cron的功能,很厉害。本文,我们就来深入的解析几种常见的php定时任务的思路。

Linux服务器上使用CronTab定时执行php

我们先从相对比较复杂的服务器执行php谈起。服务器上安装了php,就可以执行php文件,无论是否安装了nginx或Apache这样的服务器环境软件。而Linux中,使用命令行,用CronTab来定时任务,又是绝佳的选择,而且也是效率最高的选择。

首先,进入命令行模式。作为服务器的linux一般都默认进入命令行模式的,当然,我们管理服务器也一般通过putty等工具远程连接到服务器,为了方便,我们用root用户登录。在命令行中键入:

crontab -e

之后就会打开一个文件,并且是非编辑状态,则是vi的编辑界面,通过敲键盘上的i,进入编辑模式,就可以编辑内容。这个文件中的每一行就是一个定时任务,我们新建一行,就是新建一条定时任务(当然是指这一行内按照一定的格式进行书写)。我们现在来举个例子,增加一行,内容如下:

00 * * * * lynx -dump https://www.yourdomain.com/script.php

这是什么意思呢?实际上上面这一行由两部分组成,前面一部分是时间,后面一部分是操作内容。例如上面这个,

00 * * * *

就是指当当前时间的分钟数为00时,执行该定时任务。时间部分由5个时间参数组成,分别是:

分 时 日 月 周

第1列表示分钟1~59 每分钟用或者 */1表示,/n表示每n分钟,例如*/8就是每8分钟的意思,下面也是类推
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)

整个句子的后面部分就是操作的具体内容。

lynx -dump https://www.yourdomain.com/script.php

意思就是说通过lynx访问这个url。我们在使用中主要用到lynx、curl、wget来实现对url的远程访问,而如果要提高效率,直接用php去执行本地php文件是最佳选择,例如:

00 */2 * * * /usr/local/bin/php /home/www/script.php

这条语句就可以在每2小时的0分钟,通过linux内部php环境执行script.php,注意,这里可不是通过url访问,通过服务器环境来执行哦,而是直接执行,因为绕过了服务器环境,所以效率当然要高很多。

好了,已经添加了几条需要的定时任务了吧。点击键盘上的Esc键,输入“:wq”回车,这样就保存了设置的定时任务,屏幕上也能看到提示创建了新的定时任务。接下来就是好好写你的script.php了。

关于CronTab的更多用法这里就不介绍了,如果你想更灵活的使用这个定时任务功能,应该自己再去深入学习一下crontab。

Windows服务器上使用bat定时执行php

windows上和linux上有一个类似的cmd和bat文件,bat文件类似于shell文件,执行这个bat文件,就相当于依次执行里面的命令(当然,还可以通过逻辑来实现编程),所以,我们可以利用bat命令文件在windows服务器上面实现PHP定时任务。实际上在windows上定时任务,和linux上道理是一样的,只不过方法和途径不同。好了下面开始。

首先,在一个你觉得比较适当的位置创建一个cron.bat文件,然后用文本编辑器打开它(记事本都可以),在里面写上这样的内容:

D:\php\php.exe -q D:\website\test.php

这句话的意思就是,使用php.exe去执行test.php这个php文件,和上面的contab一样,绕过了服务器环境,执行效率也比较高。写好之后,点击保存,关闭编辑器。

接下来就是设置定时任务来运行cron.bat。依次打开:“开始–>控制面板–>任务计划–>添加任务计划”,在打开的界面中设置定时任务的时间、密码,通过选择,把cron.bat挂载进去。确定,这样一个定时任务就建立好了,在这个定时任务上右键,运行,这个定时任务就开始执行了,到点时,就会运行cron.bat处理,cron.bat再去执行php。

非自有服务器(虚拟主机)上实现php定时任务

如果站长没有自己的服务器,而是租用虚拟主机,就无法进入服务器系统进行上述操作。这个时候应该如何进行php定时任务呢?其实方法又有多个。

使用ignore_user_abort(true)和sleep死循环

在一个php文档的开头直接来一句:

ignore_user_abort(true);

这时,通过url访问这个php的时候,即使用户把浏览器关掉(断开连接),php也会在服务器上继续执行。利用这个特性,我们可以实现非常牛的功能,也就是通过它来实现定时任务的激活,激活之后就随便它自己怎么办了,实际上就有点类似于后台任务。

而sleep(n)则是指当程序执行到这里时,暂时不往下执行,而是休息n秒钟。如果你访问这个php,就会发现页面起码要加载n秒钟。实际上,这种长时间等待的行为是比较消耗资源的,不能大量使用。

那么定时任务到底怎么实现呢?使用下面的代码即可实现:

<?php

ignore_user_abort(true);
set_time_limit(0);
date_default_timezone_set('PRC'); // 切换到中国的时间

$run_time = strtotime('+1 day'); // 定时任务第一次执行的时间是明天的这个时候
$interval = 3600*12; // 每12个小时执行一次

if(!file_exists(dirname(__FILE__).'/cron-run')) exit(); // 在目录下存放一个cron-run文件,如果这个文件不存在,说明已经在执行过程中了,该任务就不能再激活,执行第二次,否则这个文件被多次访问的话,服务器就要崩溃掉了

do {
  if(!file_exists(dirname(__FILE__).'/cron-switch')) break; // 如果不存在cron-switch这个文件,就停止执行,这是一个开关的作用
  $gmt_time = microtime(true); // 当前的运行时间,精确到0.0001秒
  $loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 这里处理是为了确定还要等多久才开始第一次执行任务,$loop就是要等多久才执行的时间间隔
  $loop = $loop > 0 ? $loop : 0;
  if(!$loop) break; // 如果循环的间隔为零,则停止
  sleep($loop); 
  // ...
  // 执行某些代码
  // ...
  @unlink(dirname(__FILE__).'/cron-run'); // 这里就是通过删除cron-run来告诉程序,这个定时任务已经在执行过程中,不能再执行一个新的同样的任务
  $loop = $interval;
} while(true);

通过执行上面这段php代码,即可实现定时任务,直到你删除cron-switch文件,这个任务才会停止。

但是有一个问题,也就是如果用户直接访问这个php,实际上没有任何作用,页面也会停在这个地方,一直处于加载状态,有没有一种办法可以消除这种影响呢?fsockopen帮我们解决了这个问题。

fsockopen可以实现在请求访问某个文件时,不必获得返回结果就继续往下执行程序,这是和curl通常用法不一样的地方,我们在使用curl访问网页时,一定要等curl加载完网页后,才会执行curl后面的代码,虽然实际上curl也可以实现“非阻塞式”的请求,但是比fsockopen复杂的多,所以我们优先选择fsockopen,fsockopen可以在规定的时间内,比如1秒钟以内,完成对访问路径发出请求,完成之后就不管这个路径是否返回内容了,它的任务就到这里结束,可以继续往下执行程序了。利用这个特性,我们在正常的程序流中加入fsockopen,对上面我们创建的这个定时任务php的地址发出请求,即可让定时任务在后台执行。如果上面这个php的url地址是www.yourdomain.com/script.php,那么我们在编程中,可以这样:

// ...
// 正常的php执行程序
// ..

// 远程请求(不获取内容)函数,下面可以反复使用
function _sock($url) {
  $host = parse_url($url,PHP_URL_HOST);
  $port = parse_url($url,PHP_URL_PORT);
  $port = $port ? $port : 80;
  $scheme = parse_url($url,PHP_URL_SCHEME);
  $path = parse_url($url,PHP_URL_PATH);
  $query = parse_url($url,PHP_URL_QUERY);
  if($query) $path .= '?'.$query;
  if($scheme == 'https') {
    $host = 'ssl://'.$host;
  }

  $fp = fsockopen($host,$port,$error_code,$error_msg,1);
  if(!$fp) {
    return array('error_code' => $error_code,'error_msg' => $error_msg);
  }
  else {
    stream_set_blocking($fp,true);//开启了手册上说的非阻塞模式
    stream_set_timeout($fp,1);//设置超时
    $header = "GET $path HTTP/1.1\r\n";
    $header.="Host: $host\r\n";
    $header.="Connection: close\r\n\r\n";//长连接关闭
    fwrite($fp, $header);
    usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功
    fclose($fp);
    return array('error_code' => 0);
  }
}

_sock('www.yourdomain.com/script.php');

// ...
// 继续执行其他动作
// ..

把这段代码加入到某个定时任务提交结果程序中,在设置好时间后,提交,然后执行上面这个代码,就可以激活该定时任务,而且对于提交的这个用户而言,没有任何页面上的堵塞感。

借用用户的访问行为来执行某些延迟任务

但是上面使用sleep来实现定时任务,是效率很低的一种方案。我们希望不要使用这种方式来执行,这样的话就可以解决效率问题。我们借用用户访问行为来执行任务。用户对网站的访问其实是一个非常丰富的行为资源,包括搜索引擎蜘蛛对网站的访问,都可以算作这个类型。在用户访问网站时,内部加一个动作,去检查任务列表中是否存在没有被执行的任务,如果存在,就将这个任务执行。对于用户而言,利用上面所说的fsockopen,根本感觉不到自己的访问竟然还做出了这样的贡献。但是这种访问的缺点就是访问很不规律,比如你希望在凌晨2点执行某项任务,但是这个时间段非常倒霉,没有用户或任何行为到达你的网站,直到早上6点才有一个新访问。这就导致你原本打算2点执行的任务,到6点才被执行。

这里涉及到一个定时任务列表,也就是说你需要有一个列表来记录所有任务的时间、执行什么内容。一般来说,很多系统会采用数据库来记录这些任务列表,比如wordpress就是这样做的。我则利用文件读写特性,提供了托管在github上的开源项目php-cron,你可以去看看。总之,如果你想要管理多个定时任务,靠上面的单个php是无法合理布局的,必须想办法构建一个schedules列表。由于这里面的逻辑比较复杂,就不再详细阐述,我们仅停留在思路层面上。

借用第三方定时任务跳板

很好玩的是,一些服务商提供了各种类型的定时任务,例如阿里云的ACE提供了单独的定时任务,你可以填写自己应用下的某个uri。百度云BCE提供了服务器监测功能,每天会按照一定的时间规律访问应用下的固定uri。类似的第三方平台上还有很多定时任务可以用。你完全可以用这些第三方定时任务作为跳板,为你的网站定时任务服务。比如说,你可以在阿里云ACE上建立一个每天凌晨2点的定时任务,执行的uri是/cron.php。然后你创建一个cron.php,里面则采用fsockopen去访问你真正要执行某些任务的网站的url,例如上面的www.yourdomain.com/script.php,而且在cron.php中还可以访问多个url。然后把cron.php上传到你的ACE上面去,让ACE的定时任务去访问/cron.php,然后让cron.php去远程请求目标网站的定时任务脚本。

循环利用include包含文件(待验证)

php面向过程的特性使得其程序是从上往下执行的,利用这个特性,在我们使用include某个文件时,就会执行被引入的文件,知道include的文件内程序执行完之后,再往下执行。如果我们创建一个循环,再利用sleep,不断的include某个文件,使循环执行某段程序,则可以达到定时执行的目的。我们再进一步,并不是利用while(true)来实现循环,而是利用被include文件本身再include自身来实现循环,比如我们创建一个do.php,它的内容如下:

if(...) exit(); // 通过某个开关来关闭执行

// ... 
// 执行某些程序
// ...

sleep($loop); // 这个$loop在include('do.php');之前赋值

include(dirname(__FILE__).'/do.php');

其实通过这种方法执行和while的思路也像。而且同样用到sleep,效率低。

PHP定时任务是一个非常有意思的东西,虽然说实话,用系统的php.exe去直接执行php文件的效率更高,但是对于很多普通站长而言,虚拟主机是无法做到直接php执行原生程序的。本文仅提供一些解决的思路,我也仅仅是在学习中,有很多问题或表述都不正确,希望你指出来;你可以通过本文的思路,开发出自己的一种解决方案,希望你能将方案发布,并与我一起探讨。

thinkphp中html:list标签传多个参数 使用方法


/**
+----------------------------------------------------------
* 根据表单生成查询条件
* 进行列表过滤
+----------------------------------------------------------
* @access protected
+----------------------------------------------------------
* @param Model $model 数据对象
* @param HashMap $map 过滤条件
* @param string $sortBy 排序
* @param boolean $asc 是否正序
+----------------------------------------------------------
* @return void
+----------------------------------------------------------
* @throws ThinkExecption
+----------------------------------------------------------
*/
protected function _list($model, $map, $sortBy = '', $asc = false,$count=-1 ) {
//排序字段 默认为主键名
if (isset ( $_REQUEST ['_order'] )) {
$order = $_REQUEST ['_order'];
} else {
$order = ! empty ( $sortBy ) ? $sortBy : $model->getPk ();
}
//排序方式默认按照倒序排列
//接受 sost参数 0 表示倒序 非0都 表示正序
if (isset ( $_REQUEST ['_sort'] )) {
$sort = $_REQUEST ['_sort'] ? 'asc' : 'desc';
} else {
$sort = $asc ? 'asc' : 'desc';
}
//取得满足条件的记录数
if($count==-1)
$count = $model->where ( $map )->count ();
if ($count > 0) {
//创建分页对象
if (! empty ( $_REQUEST ['listRows'] )) {
$listRows = $_REQUEST ['listRows'];
} else {
$listRows = '';
}
$p = new Page ( $count, $listRows );
//分页查询数据

$voList = $model->where($map)->order( "`" . $order . "` " . $sort)->limit($p->firstRow . ',' . $p->listRows)->findAll ( );

// echo $model->getlastsql();
//分页跳转的时候保证查询条件
foreach ( $map as $key => $val ) {
if (! is_array ( $val )) {
$p->parameter .= "$key=" . urlencode ( $val ) . "&";
}
}
//分页显示

$page = $p->show ();
//列表排序显示
$sortImg = $sort; //排序图标
$sortAlt = $sort == 'desc' ? l("ASC_SORT") : l("DESC_SORT"); //排序提示
$sort = $sort == 'desc' ? 1 : 0; //排序方式
//模板赋值显示
$this->assign ( 'list', $voList );
$this->assign ( 'sort', $sort );
$this->assign ( 'order', $order );
$this->assign ( 'sortImg', $sortImg );
$this->assign ( 'sortType', $sortAlt );
$this->assign ( "page", $page);
$this->assign ( "nowPage",$p->nowPage);
}
return;
}

&nbsp;

<span style="color: #ff0000;">调用</span>

//定义条件
$map[DB_PREFIX.'user.is_delete'] = 0;

if(intval($_REQUEST['group_id'])>0)
{
$map[DB_PREFIX.'user.group_id'] = intval($_REQUEST['group_id']);
}

if(strim($_REQUEST['user_name'])!='')
{
$map[DB_PREFIX.'user.user_name'] = array('like',"%".strim($_REQUEST['user_name'])."%");
}
if(strim($_REQUEST['email'])!='')
{
$map[DB_PREFIX.'user.email'] = array('eq',strim($_REQUEST['email']));
}
if(strim($_REQUEST['mobile'])!='')
{
$map[DB_PREFIX.'user.mobile'] = array('eq',strim($_REQUEST['mobile']));
}
if(strim($_REQUEST['pid_name'])!='')
{
$pid = M("User")->where("user_name='".strim($_REQUEST['pid_name'])."'")->getField("id");
$map[DB_PREFIX.'user.pid'] = $pid;
}


if (method_exists ( $this, '_filter' )) {
$this->_filter ( $map );
}
$name=$this->getActionName();
$model = D ($name);
if (! empty ( $model )) {
$this->_list ( $model, $map );
}
$this->display ();

<html:list
id=”dataTable”
style=”dataTable”
name=”user”
checkbox=”true”
action=”true”
datasource=”list”
show=”id:{%ID}|50px,user_name:{%USER_NAME}:edit,email:{%USER_EMAIL},mobile:{%USER_MOBILE},is_robot|get_is_robot:机器人,money|format_price:{%USER_MONEY},score|format_score:会员代金券,pid|get_referrals_name:{%REFERRALS_NAME},create_time|to_date:注册时间,login_time|to_date:{%LOGIN_TIME},is_effect|get_is_effect=$user[‘id’]:{%IS_EFFECT}”
actionlist=”edit:{%EDIT}, del:{%DEL}, account:{%USER_ACCOUNT},account_detail:{%USER_ACCOUNT_DETAIL}” />

PHP生成条形码 barcodegen.1d-php5.v5.0.1.zip 在barcode官网下载

 

前阵子在做一个商家优惠券的功能,需要用到条形码,于是将资料重新整理下。

1.什么是条形码?

百度百科定义:条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成平行线的图案。在日常生活中,条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件地点起止、类别、日期等许多信息。条形码编码格式具体请参考

打印出来的优惠券,商家需要用验证器读取条形码,来获得其有效性。

 

2.如何生成条形码?

  首先找到强大的开源资料,在barcode官网下载barcodegen.1d-php5.v5.0.1.zip版本,然后解压文件放到你的Apache服务器的根目录下。

2.1文件结构:

2.2具体解析

(1)class文件夹是已封装好生成条形码的类,只需要调用即可。

(2)index.php是一个可选择条件生成条形码的功能,是主程序的入口,而html文件夹是提供的被引用的代码,code39.php指的是指向默认的编码格式。

<?php
header('Location: html/code39.php');
?>

当直接访问http://localhost/barcodegen/index.php时,用户体验可以体验该功能,任意选择项,生成对应的条形码。需要的话可以将它改版成module来使用。

(3)test.php是另外一个例子,通过代码直接生成HELLO条形码。

当访问http://localhost/barcodegen/test.php时,HELLO.PNG图片生成

View Code

 

3.实际应用

对于上面有个大概的了解后,下面我们可以重新整合下代码,更加方便的使用它。

  首先新建buildcode.php文件中,根据test.php文件进行改写,从请求的文件中获取数据:

1.条形码的编码格式

2.条形码需要的数据内容

View Code

 

然后新建test.html文件,向buildcode.php请求数据

View Code

最后访问http://localhost/barcodegen/test.html或访问http://localhost/barcodegen/buildcode.php?codebar=BCGcode39&text=abc123,浏览器直接生成png格式的条形码

其中codebar支持的编码格式可以由用户请求所得:

/*'BCGcodabar','BCGcode11','BCGcode39','BCGcode39extended','BCGcode93', 
'BCGcode128','BCGean8','BCGean13','BCGisbn','BCGi25','BCGs25','BCGmsi', 
'BCGupca','BCGupce','BCGupcext2','BCGupcext5','BCGpostnet','BCGothercode'*/

 

4.验证

  我们如何验证条形码是否有效,即能否读出条形码中的内容。

先将图片保存下来,然后访问官网提供的验证功能,将图片上传就Ok了!

 

barcode

asterisk 使用php脚本socket通过AMI端口实现自动打电话报警

最近花了些时间实现当服务器或应用服务出错进行打电话通知相关负责人,并告知那台主机什么服务出错了。
应用的场合
可以应用到安防、服务器或某应用服务运行是否正检测等任何你想用电话警报功能,如发生异常自动打电话通知你

我的系统平台:
1、一台装有NAGIOS进行判断相关设备和服务进行产生报警信息(待实现)
2、一台装有ASTEISK IPPBX系统,事先录制打通电话需要播放的语音文件

报警机制:
1、nagios产生报警信息,调用脚本将相关参数写入数据库(参数有主机名、服务名、报警等级)。
2、写个脚本实现每2分钟读取NAGIOS定入数据的相关信息,并按照报警等级来进行区分报警方式,如紧急将进行打电话和发短信通知,其它非重要报警进行发邮件通知。
3、打通电话后ASTEISK会播放事先录制好的语音文件,通话时与用户进行交互要求按下1号键进行确认后,否则系统会每一分钟自动重复他的电话。

实现的方法
1、NAGIOS这块我就不在多讲,它的作用就是检查服务是否有正常运行然后产生报警信息,网络已经有现成的资料学习。  报警状态值 $SERVICESTATEID$宏的返回值: 0=OK(正常)、1=WARNING(告警)、2=CRITICAL(紧急)和3=UNKNOWN(未知)。
2、这里我用PHP脚本与asteisk 进行通信连接,实现的代码如下:

 

1).php脚本

/var/www/html/hello.php
#! /usr/bin/php
<?php
$server=’10.236.22.116′;
$port=’5038′;
$errno=1;
$errstr=’登陆失败’;
$timeout=5;
$socket = fsockopen($server,$port, $errno, $errstr, $timeout); //连接服务器
if( $socket == false)      {        die ($errno.’:’.$errstr);      }
fputs($socket, “Action: login/r/n”); //登录
fputs($socket, “Username: admin/r/n”); //用户名
fputs($socket, “Secret: admin/r/n/r/n”);//密码
fputs($socket, “Action: Originate/r/n”);
fputs($socket, “Channel: Local/015003069007@user/r/n“); //你要打的电话
fputs($socket, “CallerID: 10016/r/n”);//来电显示的号码
fputs($socket, “WaitTime: 30/r/n”);//等待被叫应答振铃时间
fputs($socket, “Exten: queue1/r/n”);//调用的拨号方案,对方接听电话后我们在这里实现交互
fputs($socket, “Context: user/r/n”);
fputs($socket, “Priority: 1/r/n”);
fputs($socket, “Async: yes/r/n/r/n” );
$wrets=fgets($socket,128);
?>

 

2).监控服务器网络是否正常(可拓展)

/sbin/http.sh
#!/bin/bash
LANG=C
server_all_list=(10.236.23.2:80 10.236.23.3:80 10.236.23.4:80 )
date=$(date -d “today” +”%Y-%m-%d_%H:%M:%S”)

server_all_len=${#server_all_list[*]}

i=0
while [ $i -lt $server_all_len ]
do
server_ip=$(echo ${server_all_list[$i]} | awk -F ‘:’ ‘{print $1}’)

server_port=$(echo ${server_all_list[$i]} | awk -F ‘:’ ‘{print $2}’)

if ping -c 1 $server_ip
then
echo “服务器${server_ip}连接ping正常!”
else
echo “服务器${server_ip}无法Ping通!”

#网络异常,打电话通知
/usr/bin/php /var/www/html/hello.php

#网络异常,发邮件通知(邮箱有短信提醒功能)
echo “${date}: Server monitoring system,Please don’t replay!” | mail -s “${server_ip}Request timed out,Please deal with failure!” 15000469007@wo.com.cn
fi
let i++
done

 

3)(待实现)

asterisk 的拨号方案,也就是电话接通后你希望怎么与用户进行交互的实现

[from-d]
exten => s,1,Answer()
exten => s,2,MYSQL(Connect connid localhost root passw0rd dial)
exten => s,3,MYSQL(Query resultid ${connid} SELECT * from log where mark=1) //取出报警相关信息,主要就是语音文件名
exten => s,4,MYSQL(Fetch fetchid ${resultid} info1/ info2/ info3/ info4)
exten => s,5,Wait(1)
exten => s,6,Playback(fd/${info4}) //播放主机名
exten => s,7,Background(fd/${info2}) //播放报错信息
exten => s,8,Background(fd/1confirm) //提示用户按1号键确认
exten => s,9,Wait(1)
exten => s,10,goto(from-d,s,6)
exten => 1,1,MYSQL(Connect connid1 localhost root passw0rd dial)
exten => 1,2,MYSQL(Query resultid1 ${connid1} UPDATE/ log/ SET/ mark=0/ WHERE/ id=${info1})
exten => 1,3,Playback(vm-goodbye)
exten => 1,4,Wait(2)
exten => 1,5,Hangup
exten => i,n,Playback(invalid)

 

4)定制任务每分钟执行一次

cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
*/1 * * * * root /sbin/http.sh

 

http://m.blog.csdn.net/article/details?id=6567185

speedphp 模板标签 {if},{elseif},{else}

{if},{elseif},{else}

{if},{elseif},{else}

Smarty的{if}条件判断和PHP的if 非常相似,只是增加了一些特性。 每个{if}必须有一个配对的{/if}. 也可以使用{else}{elseif}. 全部的PHP条件表达式和函数都可以在if内使用,如||, or, &&, and, is_array(), 等等.

如果开启了安全机制,那么只有在$php_functions设置允许的PHP函数才能使用。 参见安全机制

下面是可用的运算符列表,使用中都会放到元素的中间并且用空格分隔。 注意列表中[方括号]的是可选的,而且还会列出对应PHP的表达式。

运算符 别名 语法示例 含义 对应PHP语法
== eq $a eq $b 等于 ==
!= ne, neq $a neq $b 不等于 !=
> gt $a gt $b 大于 >
< lt $a lt $b 小于 <
>= gte, ge $a ge $b 大于等于 >=
<= lte, le $a le $b 小于等于 <=
=== $a === 0 绝对等于 ===
! not not $a 非 (一元运算) !
% mod $a mod $b 取模 %
is [not] div by $a is not div by 4 取模为0 $a % $b == 0
is [not] even $a is not even [非] 取模为0 (一元运算) $a % 2 == 0
is [not] even by $a is not even by $b 水平分组 [非] 平均 ($a / $b) % 2 == 0
is [not] odd $a is not odd [非] 奇数 (一元运算) $a % 2 != 0
is [not] odd by $a is not odd by $b [非] 奇数分组 ($a / $b) % 2 != 0

Example 7.44. {if} 表达式

{if $name eq 'Fred'}
    Welcome Sir.
{elseif $name eq 'Wilma'}
    Welcome Ma'am.
{else}
    Welcome, whatever you are.
{/if}

{* an example with "or" logic *}
{if $name eq 'Fred' or $name eq 'Wilma'}
   ...
{/if}

{* same as above *}
{if $name == 'Fred' || $name == 'Wilma'}
   ...
{/if}


{* parenthesis are allowed *}
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
   ...
{/if}


{* you can also embed php function calls *}
{if count($var) gt 0}
   ...
{/if}

{* check for array. *}
{if is_array($foo) }
   .....
{/if}

{* check for not null. *}
{if isset($foo) }
   .....
{/if}


{* test if values are even or odd *}
{if $var is even}
   ...
{/if}
{if $var is odd}
   ...
{/if}
{if $var is not odd}
   ...
{/if}


{* test if var is divisible by 4 *}
{if $var is div by 4}
   ...
{/if}


{*
  test if var is even, grouped by two. i.e.,
  0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
*}
{if $var is even by 2}
   ...
{/if}

{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
{if $var is even by 3}
   ...
{/if}


Example 7.45. {if} 的更多例子

 
{if isset($name) && $name == 'Blog'}
     {* do something *}
{elseif $name == $foo}
    {* do something *}
{/if}

{if is_array($foo) && count($foo) > 0}
    {* do a foreach loop *}
{/if}