标签存档: PHP

通过Nginx反向代理访问SwooleHttp服务

按照以下要求修改你的Nginx配置文件后启重Nginx:

server {
    listen 80;
    server_name sw.cpxiang.tech;
    return 301 https://$host$request_uri; # 将HTTP请求重定向到HTTPS
}

server {
    listen 443 ssl;
    server_name sw.cpxiang.tech;

    ssl_certificate /path/to/fullchain.pem; # SSL证书路径
    ssl_certificate_key /path/to/privkey.pem; # 私钥路径

    location / {
        proxy_pass http://127.0.0.1:9501; # 假设Swoole监听于9501端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Swoole异步MySQL查询

Swoole支持异步MySQL客户端,可以在不阻塞主服务器进程的情况下执行数据库查询。

这对于需要频繁访问数据库的应用来说非常有用。

$server = new Swoole\Server("127.0.0.1", 9501);
 
$server->on('start', function ($server) {
 
    echo "Swoole server is started at http://127.0.0.1:9501\n";
 
});
 
$server->on('receive', function ($server, $fd, $from_id, $data) {
 
    // 异步查询数据库
 
    $db = new Swoole\Coroutine\MySQL();
 
    $server->defer(function () use ($db) {
 
        $db->close();
 
    });
 
    $db->connect([
 
        'host' => '127.0.0.1',
 
        'user' => 'db_user',
 
        'password' => 'db_password',
 
        'database' => 'test',
 
        'charset' => 'utf8',
 
    ]);
 
    $sql = "SELECT * FROM your_table WHERE id = ?";
 
    $stmt = $db->prepare($sql);
 
    $result = $stmt->execute([1]);
 
    if ($result) {
 
        $row = $stmt->fetch();
 
        $server->send($fd, json_encode($row));
 
    } else {
 
        $server->send($fd, "Error: " . $db->error);
 
    }
 
});
 
$server->start();

上面的代码示例使用了Swoole的协程MySQL客户端,它需要在Swoole 4.1.0 或更高版本中启用协程支持。

`$server->defer` 用于确保在协程结束时关闭数据库连接。


人民币数字转为大写函数

/**
 *数字金额转换成中文大写金额的函数
 *String Int $num 要转换的小写数字或小写字符串
 *return 大写
 *小数位为两位
 **/
function convertAmountToCn($num){
	$c1 = "零壹贰叁肆伍陆柒捌玖";
	$c2 = "分角元拾佰仟万拾佰仟亿";
	//精确到分后面就不要了,所以只留两个小数位
	$num = round($num, 2);
	//将数字转化为整数
	$num = $num * 100;
	if (strlen($num) > 10) {
		return "金额太大,请检查";
	}
	$i = 0;
	$c = "";
	while (1) {
		if ($i == 0) {
			//获取最后一位数字
			$n = substr($num, strlen($num)-1, 1);
		} else {
			$n = $num % 10;
		}
		//每次将最后一位数字转化为中文
		$p1 = substr($c1, 3 * $n, 3);
		$p2 = substr($c2, 3 * $i, 3);
		if ($n!='0' || ($n=='0' && ($p2=='亿' || $p2=='万' || $p2=='元'))) {
			$c = $p1 . $p2 . $c;
		} else {
			$c = $p1 . $c;
		}
		$i = $i + 1;
		//去掉数字最后一位了
		$num = $num / 10;
		$num = (int)$num;
		//结束循环
		if ($num == 0) {
			break;
		}
	}
	$j = 0;
	$slen = strlen($c);
	while ($j < $slen) {
		//utf8一个汉字相当3个字符
		$m = substr($c, $j, 6);
		//处理数字中很多0的情况,每次循环去掉一个汉字“零”
		if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') {
			$left = substr($c, 0, $j);
			$right = substr($c, $j + 3);
			$c = $left . $right;
			$j = $j-3;
			$slen = $slen-3;
		}
		$j = $j + 3;
	}
	//这个是为了去掉类似23.0中最后一个“零”字
	if (substr($c, strlen($c)-3, 3) == '零') {
		$c = substr($c, 0, strlen($c)-3);
	}
	//将处理的汉字加上“整”
	if (empty($c)) {
		return "零元整";
	}else{
		if(strpos($c,"角") > 0 || strpos($c,"分") > 0){
			return $c;
		}else{
			return $c . "整";
		}		
	}
}

PHP读取Excel文档

<?php
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';
require_once 'PHPExcel/Reader/Excel5.php';
/* 以上三步加载phpExcel的类
下载地址:https://github.com/PHPOffice/PHPExcel/tree/1.8/Classes */

$filename='F:\PhpStudy\PHPTutorial\WWW\exc\test.xlsx';//指定excel文件

$file = iconv("utf-8","gb2312",$filename);   //转码 

if(empty($file) OR !file_exists($file)) {  
    die('file not exists!');  
}

$extension = strtolower( pathinfo($filename, PATHINFO_EXTENSION) );

if ($extension =='xlsx') {

	$objReader = PHPExcel_IOFactory::createReader('excel2007');
    $objReader->setReadDataOnly(true);
    $objReader->setLoadSheetsOnly(true);	
    $objExcel = $objReader ->load($filename);
} elseif ($extension =='xls') {

	$objReader = PHPExcel_IOFactory::createReader('excel5');
    $objReader->setReadDataOnly(true);
    $objReader->setLoadSheetsOnly(true);	
    $objExcel = $objReader ->load($filename);
}

$sheet = $objExcel->getSheet(0)->toArray(); 

print_r($sheet);

参考:https://baike.baidu.com/item/phpexcel/10979571

PHP中的break与continue关键字

/*
 * 在PHP中break语句不仅可以跳出当前循环,还可以指定跳出几层循环
 * break $num;  num为向外跳的层数 num不能大于最大循环层数
 */
 
//  第三重循环
while(true) {
    //  第二重
    for(;;) {
        //  第一重
        for($i = 0; $i <= 10; $i++) {
            echo "$i \n";
            if($i == 7) {
                echo "i=7, 跳出1重循环";
                break;
            }
        }
        echo "\n";
        //  第一重
        for($i = 0; $i <= 20; $i++){
            echo "$i \n";
            if($i == 15) {
                echo "i=15, 跳出3重循环";
                break 3;
            }
        }
        echo "绝对不会输出这里";
    }
}
 
/*
 * PHP中continue只能终止本次循环而进入到下一次循环中,
 * continue $num 可以指定终止第几重的当前循环  num不能大于最大循环层数
 */
$arr = array(1,2,3,4,5,6,7,8,9,10);
for($i = 0; $i < 10; $i++) {
    if($i % 2 == 0){
        continue;
    }
    for(;;){
        for($j = 0; $j < count($arr); $j++) {
            if($j == $i){
                echo "\n";
                continue 3; //终止第三层的当前循环
            }else{
                echo "\$arr[".$j."]:".$arr[$j]." ";
            }
        }
    }
    echo "这里也绝对不会输出"; 
}