最近在开发一个PHP程序时遇到了下面的错误:
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
错误信息显示允许的最大内存已经耗尽。遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据。可想而知,4万条数据全部加载到内存中,内存不爆才怪。
毕竟编程这么多年,我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在官方网站上找到的正确的用法。
这个问题在PHP的官方网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。 PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将 指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。
相对的,另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。
很显然,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。
对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。

威盾PHP加密专家解密算法 不指定

jed , 2018-3-14 10:34 , 代码编程 , 评论(0) , 阅读(10370) , Via 本站原创

<?php
/***********************************
*威盾PHP加密专家解密算法 By:Neeao
*http://Neeao.com
*2009-09-10
***********************************/

$filename="logincheck-hou.php";//要解密的文件
$lines = file($filename);//0,1,2行

//第一次base64解密
$content="";
if(preg_match("/O0O0000O0\('.*'\)/",$lines[1],$y))
{
    $content=str_replace("O0O0000O0('","",$y[0]);
    $content=str_replace("')","",$content);
    $content=base64_decode($content);
}


//第一次base64解密后的内容中查找密钥
$decode_key="";
if(preg_match("/\),'.*',/",$content,$k))
{
    $decode_key=str_replace("),'","",$k[0]);
    $decode_key=str_replace("',","",$decode_key);
}

//查找要截取字符串长度
$str_length="";
if(preg_match("/,\d*\),/",$content,$k))
{
    $str_length=str_replace("),","",$k[0]);
    $str_length=str_replace(",","",$str_length);
}
//截取文件加密后的密文
$Secret=substr($lines[2],$str_length);
//echo $Secret;

//直接还原密文输出
/*echo "<?php\n".base64_decode(strtr($Secret,$decode_key,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'))."?>";
*/

file_put_contents("test.php", "<?php\n".base64_decode(strtr($Secret,$decode_key,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'))."?>" );

?>

PHP 生成数据字典 不指定

jed , 2018-3-14 10:20 , 代码编程 , 评论(0) , 阅读(10156) , Via 本站原创

<?php
/**
* 生成mysql数据字典
*/
header("Content-type: text/html; charset=utf-8");
//配置数据库
$dbserver   = "127.0.0.1";
$database   = "vuethink";
$user = 'root';
$password = 'root';
//其他配置
$dsn = "mysql:dbname=$database;host=$dbserver";


try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->exec('SET NAMES utf8');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$table_result = $pdo->query('show tables')->fetchAll();

$no_show_table = array();    //不需要显示的表
$no_show_field = array();   //不需要显示的字段

//取得所有的表名
foreach ($table_result as $row) {
    if(!in_array($row[0],$no_show_table)){
        $tables[]['TABLE_NAME'] = $row[0];
    }
}


//替换所以表的表前缀
if(@$_GET['prefix']){
    $prefix = 'oa';
    foreach($tables as $key => $val){
        $tableName = $val['TABLE_NAME'];
        $string = explode('_',$tableName);
        if($string[0] != $prefix){  
            $string[0] = $prefix;  
            $newTableName = implode('_', $string);  
            mysqli_query('rename table '.$tableName.' TO '.$newTableName);  
        }
    }
    echo "替换成功!";exit();
}

//循环取得所有表的备注及表中列消息
foreach ($tables as $k=>$v) {
    $sql  = 'SELECT * FROM ';
    $sql .= 'INFORMATION_SCHEMA.TABLES ';
    $sql .= 'WHERE ';
    $sql .= "table_name = '{$v['TABLE_NAME']}'  AND table_schema = '{$database}'";
    $table_result = $pdo->query($sql)->fetchAll();
    foreach ($table_result as $t) {
        $tables[$k]['TABLE_COMMENT'] = $t['TABLE_COMMENT'];
    }
    

    $sql  = 'SELECT * FROM ';
    $sql .= 'INFORMATION_SCHEMA.COLUMNS ';
    $sql .= 'WHERE ';
    $sql .= "table_name = '{$v['TABLE_NAME']}' AND table_schema = '{$database}'";

    $fields = array();
    $field_result = $pdo->query($sql)->fetchAll();
    foreach ($field_result as $t) {
        $fields[] = $t;
    }
    $tables[$k]['COLUMN'] = $fields;
}



$html = '';
//循环所有表
foreach ($tables as $k=>$v) {
    $html .= '  <h3>' . ($k + 1) . '、' . $v['TABLE_COMMENT'] .'  ('. $v['TABLE_NAME']. ')</h3>'."\n";
    $html .= '  <table border="1" cellspacing="0" cellpadding="0" width="100%">'."\n";
    $html .= '      <tbody>'."\n";
    $html .= '          <tr>'."\n";
    $html .= '              <th>字段名</th>'."\n";
    $html .= '              <th>数据类型</th>'."\n";
    $html .= '              <th>默认值</th>'."\n";
    $html .= '              <th>允许非空</th>'."\n";
    $html .= '              <th>自动递增</th>'."\n";
    $html .= '              <th>备注</th>'."\n";
    $html .= '          </tr>'."\n";

    foreach ($v['COLUMN'] as $f) {
        if(@!is_array($no_show_field[$v['TABLE_NAME']])){
            $no_show_field[$v['TABLE_NAME']] = array();
        }
        if(!in_array($f['COLUMN_NAME'],$no_show_field[$v['TABLE_NAME']])){
            $html .= '          <tr>'."\n";
            $html .= '              <td class="c1">' . $f['COLUMN_NAME'] . '</td>'."\n";
            $html .= '              <td class="c2">' . $f['COLUMN_TYPE'] . '</td>'."\n";
            $html .= '              <td class="c3">' . $f['COLUMN_DEFAULT'] . '</td>'."\n";
            $html .= '              <td class="c4">' . $f['IS_NULLABLE'] . '</td>'."\n";
            $html .= '              <td class="c5">' . ($f['EXTRA']=='auto_increment'?'是':'&nbsp;') . '</td>'."\n";
            $html .= '              <td class="c6">' . $f['COLUMN_COMMENT'] . '</td>'."\n";
            $html .= '          </tr>'."\n";
        }
    }
    $html .= '      </tbody>'."\n";
    $html .= '  </table>'."\n";
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>数据库数据字典生成代码</title>
<meta name="generator" content="ThinkDb V1.0" />
<meta name="author" content="数据库数据字典生成代码" />
<style>
body, td, th { font-family: "微软雅黑"; font-size: 14px; }
.warp{margin:auto; width:900px;}
.warp h3{margin:0px; padding:0px; line-height:30px; margin-top:10px;}
table { border-collapse: collapse; border: 1px solid #CCC; background: #efefef; }
table th { text-align: left; font-weight: bold; height: 26px; line-height: 26px; font-size: 14px; text-align:center; border: 1px solid #CCC; padding:5px;}
table td { height: 20px; font-size: 14px; border: 1px solid #CCC; background-color: #fff; padding:5px;}
.c1 { width: 120px; }
.c2 { width: 120px; }
.c3 { width: 150px; }
.c4 { width: 80px; text-align:center;}
.c5 { width: 80px; text-align:center;}
.c6 { width: 270px; }
</style>
</head>
<body>
<div class="warp">
    <h1 style="text-align:center;">数据库数据字典</h1>
<?php echo $html; ?>
</div>
</body>
</html>

PHP文件操作类 不指定

jed , 2018-3-14 10:17 , 代码编程 , 评论(0) , 阅读(9544) , Via 本站原创
* FileUtil::createDir('a/1/2/3'); 测试建立文件夹 建一个a/1/2/3文件夹
* FileUtil::createFile('b/1/2/3'); 测试建立文件 在b/1/2/文件夹下面建一个3文件
* FileUtil::createFile('b/1/2/3.exe'); 测试建立文件 在b/1/2/文件夹下面建一个3.exe文件
* FileUtil::copyDir('b','d/e'); 测试复制文件夹 建立一个d/e文件夹,把b文件夹下的内容复制进去
* FileUtil::copyFile('b/1/2/3.exe','b/b/3.exe'); 测试复制文件 建立一个b/b文件夹,并把b/1/2文件夹中的3.exe文件复制进去
* FileUtil::moveDir('a/','b/c'); 测试移动文件夹 建立一个b/c文件夹,并把a文件夹下的内容移动进去,并删除a文件夹
* FileUtil::moveFile('b/1/2/3.exe','b/d/3.exe'); 测试移动文件 建立一个b/d文件夹,并把b/1/2中的3.exe移动进去
* FileUtil::unlinkFile('b/d/3.exe'); 测试删除文件 删除b/d/3.exe文件
* FileUtil::unlinkDir('d'); 测试删除文件夹 删除d文件夹

简单的PHP日志函数 不指定

jed , 2018-3-14 10:15 , 代码编程 , 评论(0) , 阅读(7669) , Via 本站原创
生成txt格式的日志文件

php程序获取客户端MAC地址 不指定

jed , 2018-3-14 10:12 , 代码编程 , 评论(0) , 阅读(5109) , Via 本站原创

<?php
class GetMacAddr{
var $return_array = array(); //
var $mac_addr;
function GetMacAddr($os_type){
switch ( strtolower($os_type) ){
case "linux":
$this->forLinux();
break;
case "solaris":
break;
case "unix":
break;
case "aix":
break;
default:
$this->forWindows();
break;
}
$temp_array = array();
foreach ( $this->return_array as $value ){
if (
preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value,
$temp_array ) ){
$this->mac_addr = $temp_array[0];
break;
}
}
unset($temp_array);
return $this->mac_addr;
}
function forWindows(){
@exec("ipconfig /all", $this->return_array);
if ( $this->return_array )
return $this->return_array;
else{
$ipconfig = $_SERVER["WINDIR"]."\system32\ipconfig.exe";
if ( is_file($ipconfig) )
@exec($ipconfig." /all", $this->return_array);
else
@exec($_SERVER["WINDIR"]."\system\ipconfig.exe /all", $this->return_array);
return $this->return_array;
}
}
function forLinux(){
@exec("ifconfig -a", $this->return_array);
return $this->return_array;
}
}
//·½·¨Ê¹ÓÃ
$mac = new GetMacAddr(PHP_OS);
echo $mac->mac_addr;
?>

PHP价格转财务大写 不指定

jed , 2018-3-14 10:09 , 代码编程 , 评论(0) , 阅读(1757) , Via 本站原创

function currencyToChinese($data)
{
    $data = str_replace(',', '', $data);

    if ($data == '') {
        return '';
    }

    $prefix = '';
    $cncap = '';

    if ($data < 0) {
        $prefix .= '负';
        $data = substr($data, 1, strlen($data) - 1);
    }

    $capnum = array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
    $capdigit = array("", "拾", "佰", "仟");
    $subdata = explode(".", $data);
    if (!isset($subdata[1])) {
        $subdata[1] = 0;
    }

    if (intval($subdata[0]) == 0 && intval($subdata[1]) == 0) {
        return $prefix . "零元整";
    }

    $yuan = $subdata[0];
    $j = 0; $nonzero = 0;
    for ($i = 0; $i < strlen($subdata[0]); $i++) {
        if (0 == $i) { //确定个位
            if (intval($subdata[1]) != 0) {
                if (substr($subdata[0], -1, 1) == 0) {
                    $cncap .= "元零";
                } else {
                    $cncap .= "元";
                }
            } else {
                if (intval($subdata[0]) != 0) {
                    $cncap = "元";
                }

            }
        }
        if (4 == $i) {
            $j = 0;
            $nonzero = 0;
            $cncap = "万" . $cncap;
        } //确定万位
        if (8 == $i) {
            $j = 0;
            $nonzero=0;
            $cncap="亿" . $cncap;
        } //确定亿位
        $numb = substr($yuan, -1, 1); //截取尾数
        $cncap = ($numb) ?
            $capnum[$numb] . $capdigit[$j] . $cncap : (($nonzero)?"零" . $cncap : $cncap);
        $nonzero = ($numb) ? 1 : $nonzero;
        $yuan = substr($yuan, 0, strlen($yuan)-1); //截去尾数
        $j++;
    }
    $chiao = '';
    $cent = '';
    if (intval($subdata[1]) != 0) {
        $chiao = (substr($subdata[1], 0, 1)) ?
            $capnum[substr($subdata[1], 0, 1)] . "角" : "零";
        $cent = (substr($subdata[1], 1, 1)) ?
            $capnum[substr($subdata[1], 1, 1)] . "分" : "零分";
    }

    $cncap .= $chiao.$cent;
    if (substr($subdata[1], -1, 1) === '0') {
        $cncap .= "整";
    }
    $cncap = preg_replace("/(零)+/", "\\1", $cncap); //合并连续“零”

    if (intval($subdata[0]) == 0) {
        $cncap = preg_replace("/(元零)+/", "", $cncap);
        $cncap = preg_replace("/(元)+/", "", $cncap);
    }
    if (intval($subdata[1]) == 0 || substr($subdata[1], -1, 1) === '0') {
        $cncap = preg_replace("/(零分)+/", "", $cncap);
    }

    return $prefix . $cncap;
}

PHP字符编码转换 不指定

jed , 2018-3-14 10:08 , 代码编程 , 评论(0) , 阅读(1584) , Via 本站原创

<?php

function characet($data,$code='UTF-8'){
        if( !empty($data) ){
            $fileType = mb_detect_encoding($data , array('UTF-8','GBK','LATIN1','BIG5')) ;
            if( $fileType != $code){
                $data = mb_convert_encoding($data ,$code, $fileType);
            }
        }
        return $data;
    }
?>

获取数组中指定key的值 不指定

jed , 2018-3-14 10:07 , 代码编程 , 评论(0) , 阅读(1423) , Via 本站原创

function getKeyValues($arr, $key)
{
    $ret = [];

    foreach ($arr as $row) {
        if (is_array($row) && array_key_exists($key, $row)) {
            $ret[] = $row[$key];
        } elseif ($row instanceof \ArrayObject) {
            $row->offsetExists($key) && $ret[] = $row->offsetGet($key);
        }
    }

    return $ret;
}

PHP检测是否是手机访问 不指定

jed , 2018-3-14 10:02 , 代码编程 , 评论(0) , 阅读(1695) , Via 本站原创

/**
* 检测是否是手机访问
*/
function is_mobile()
{
    $useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
    $useragent_commentsblock = preg_match('|\(.*?\)|', $useragent, $matches) > 0 ? $matches[0] : '';
    function _is_mobile($substrs, $text)
    {
        foreach ($substrs as $substr)
            if (false !== strpos($text, $substr)) {
                return true;
            }
        return false;
    }

    $mobile_os_list = array('Google Wireless Transcoder', 'Windows CE', 'WindowsCE', 'Symbian', 'Android', 'armv6l', 'armv5', 'Mobile', 'CentOS', 'mowser', 'AvantGo', 'Opera Mobi', 'J2ME/MIDP', 'Smartphone', 'Go.Web', 'Palm', 'iPAQ');
    $mobile_token_list = array('Profile/MIDP', 'Configuration/CLDC-', '160×160', '176×220', '240×240', '240×320', '320×240', 'UP.Browser', 'UP.Link', 'SymbianOS', 'PalmOS', 'PocketPC', 'SonyEricsson', 'Nokia', 'BlackBerry', 'Vodafone', 'BenQ', 'Novarra-Vision', 'Iris', 'NetFront', 'HTC_', 'Xda_', 'SAMSUNG-SGH', 'Wapaka', 'DoCoMo', 'iPhone', 'iPod');

    $found_mobile = _is_mobile($mobile_os_list, $useragent_commentsblock) ||
        _is_mobile($mobile_token_list, $useragent);
    if ($found_mobile) {
        return true;
    } else {
        return false;
    }
}
分页: 9/81 第一页 上页 4 5 6 7 8 9 10 11 12 13 下页 最后页 [ 显示模式: 摘要 | 列表 ]