Posted on

支付宝接口研究

我自己要做一个支付接口,于是看看业内的最佳实践支付宝是怎么做的。
1.商户系统用get或者post方式请求支付宝api
2.用户在支付宝系统上支付完成后,get请求商户url,同时post请求商户url,返回异步参数
3.商户系统还可以通过支付宝api查询支付情况
所以支付宝接口接受一次输入,有2次输出,还提供一个查询api。

Posted on

php中的pdo用法

1.设置DSN(数据源名称)

$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);

2.执行queries

$stmt = $pdo->query('SELECT name FROM users');
while ($row = $stmt->fetch())
{
    echo $row['name'] . "\n";
}

3.预防sql注入

2种写法:

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status=?');
$stmt->execute([$email, $status]);
$user = $stmt->fetch();
// or
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute(['email' => $email, 'status' => $status]);
$user = $stmt->fetch();

 

Posted on

mysql基础

1.关系数据库优点:

比普通文件的数据访问速度快。
更容易查询并提取满足特定条件的数据
有专门的内置机制处理并发访问。
可以提供对数据的随机访问。
具有内置的权限系统。
表格:关系数据库由关系组成,这些关系通常称为表格。
列:表中的每一列都有唯一的名称,包含不同的数据。每一列都有一个数据类型。
行:每一行代表一条记录。
键:标识每一个特定记录的方法。
模式:数据库整套表格的完整设计称为数据库的模式。它是数据库的设计蓝图。
关系:外键表示两个表格数据的关系。
三种基本关系:一对一、一对多、多对多。

2.设计数据库

考虑建模的实际对象:当创建一个数据库时,我们经常为现实世界的实体和关系建立模型,并且存储这些实体对象与关系的信息。
避免保存冗余信息:1.空间浪费。2.导致数据更新不一致
使用原子列值:每一行的每个属性只存储一个数据。
选择有意义的键。
考虑要询问数据库的问题。
避免多个空属性的设计。
表格类型的总结:
1.描述现实世界的简单表。这些表也可能包含其他简单对象的键,他们之间有一对一或一对多的关系。
2.描述两个现实世界对象的多对多关系的关联表。

Posted on

安装laravel

1,安装composer

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

移动到PATH目录:

mv composer.phar /usr/local/bin/composer

2.安装laravel

composer global require "laravel/installer"

设置环境变量:

echo $PATH
export PATH=$PATH:/home/ubuntu/.config/composer

新建一个laravel程序:

laravel new blog

 
 

Posted on

ubuntu 14.04 安装bbr

bbr可以简单理解为tcp加速算法。

1.查看当前内核

uname -r
输出4.4.0-78-generic

2.查看可用内核

dpkg -l|grep linux-image
输出:
ii linux-image-4.4.0-78-generic 4.4.0-78.99~14.04.2 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-4.4.0-79-generic 4.4.0-79.100~14.04.1 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-78-generic 4.4.0-78.99~14.04.2 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-79-generic 4.4.0-79.100~14.04.1 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-generic-lts-xenial 4.4.0.79.64 amd64 Generic Linux kernel image

3.下载最新内核

去http://kernel.ubuntu.com/~kernel-ppa/mainline/页面底部下载最新内核:
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.12-rc4/linux-image-4.12.0-041200rc4-generic_4.12.0-041200rc4.201706042031_amd64.deb

4.安装

sudo dpkg -i linux-image-4.12.0-041200rc4-generic_4.12.0-041200rc4.201706042031_amd64.deb
安装最后输出:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.12.0-041200rc4-generic
Found initrd image: /boot/initrd.img-4.12.0-041200rc4-generic
Found linux image: /boot/vmlinuz-4.4.0-79-generic
Found initrd image: /boot/initrd.img-4.4.0-79-generic
Found linux image: /boot/vmlinuz-4.4.0-78-generic
Found initrd image: /boot/initrd.img-4.4.0-78-generic
done
可以看到,已经更新了引导文件,并把我们新安装的内核排到了第一位,所以并不用卸载旧内核了。
再查看一次内核:
dpkg -l|grep linux-image
输出:
ii linux-image-4.12.0-041200rc4-generic 4.12.0-041200rc4.201706042031 amd64 Linux kernel image for version 4.12.0 on 64 bit x86 SMP
ii linux-image-4.4.0-78-generic 4.4.0-78.99~14.04.2 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-4.4.0-79-generic 4.4.0-79.100~14.04.1 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-78-generic 4.4.0-78.99~14.04.2 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-79-generic 4.4.0-79.100~14.04.1 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-generic-lts-xenial 4.4.0.79.64 amd64 Generic Linux kernel image
重启:sudo reboot

5.重连服务器

查看当前内核:uname -r
输出:4.12.0-041200rc4-generic 
已经成功

6.开启bbr

修改系统配置:
sudo bash -c 'echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf'
sudo bash -c 'echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf'
保存:
sudo sysctl -p

7.测试

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

如果结果都有bbr代表成功。
lsmod | grep bbr
也应该有bbr。

8.实测

原来的速度:

开启bbr以后的速度:

速度竟然降了,怎么回事呢?

-end-

Posted on

php实现面向对象

对象可以用于表示所有实物或概念。面向对象软件由一系列具有属性和操作的自包含对象组成,这些对象之间能够交互,从而达到我们的要求。

1.类和对象

对象的属性是与对象相关的特性或变量。对象的操作是对象可以执行的、用来改变其自身或对外部产生影响的方法、行为或函数。
封装也叫做数据隐藏。从本质上说,访问一个对象中的数据只能通过对象的操作来实现,对象的操作也就是对象的接口。
对象是一个被保存数据和操作这些数据的操作方法的唯一、可标识的集合。
对象可以按类进行分类。类是表示彼此之间可能互不相同,但是必须具有一些共同特点的对象集合。

2.多态

面向对象的编程语言必须支持多态性,多态性的意思是指不同的类对同一操作可以有不同的行为。

3.继承

继承允许我们使用子类在类之间创建层次关系。子类将从它的超类继承属性和操作。

4.创建类、属性和操作

一个最小的类:

class classname { }

包含属性的类:

class classname
{
public $att1;
public $att2;
}

包含操作的类:

class classname
{
  function operation1() {}
  function operation2($param1, $param2) {}
}

构造函数:

大多数类都有一种称为构造函数的特殊操作。当创建一个对象时,它将调用构造函数,通常将执行一些有用的初始化任务:列如,设置属性的初始值或者创建该对象需要的其他对象。
构造函数的名称是__construct().
有构造函数的类:
class classname 
{
  function __construct($param)
{echo "constructor called with parameter".$param."<br />";}
}

析构函数:

与构造函数相对,析构函数允许在销毁一个类之前执行一些操作或完成一些功能。
析构函数名称是__destruct()。

5.类的实例化

 

Posted on

php中session的用法

1.http是无状态的协议

用session可以追踪用户。

2.sessionID

sessionID是一个加密的随机数字,由php生成,可保存在cookie中,也可通过url传递。
session函数自动设置cookie。

3.实现session

session_start();  //检查是否有一个sessionID存在,如果不存在,就创建一个。必须在脚本开始部分调用。
$_SESSION['myvar'] = 5;   //注册session变量。
unset($_SESSION['myvar']);  //注销变量
session_destroy(); //销毁session。

4.用session实现身份验证。

authmain.php

<?php
session_start();
if (isset($_POST['userid']) && isset($_POST['password']) )
{
//if the user has just tried to log in
$userid = $_POST['userid'];
$password = $_POST['password'];
 
$db_conn = new mysqli('localhost', 'web', 'web', 'auth');
 
if (mysqli_connect_errno()){
echo 'connection failed';
exit();
}
$query = 'select * from authorized_users'."where name='$userid'"."and password=sha1('$password')";
$result = $db_conn->query($query);
if ($result->num_rows)
{
$_SESSION['valid_user'] = $userid;
}
$db_conn->close();
}
?>
<html>
<body>
<h1>home page</h1>
<?php
if (isset($_SESSION['valid_user']))
{
echo 'you are logged in as:'.$_SESSION['valid_user'].'<br />';
echo '<a href="logout.php">log out</a><br />';
}
else
{
if (isset($userid))
{echo 'could not log you in.<br />';}
else
{
echo 'you are not loged in.<br />';
}
echo '<form method="post" action="authmain.php">';
...//完成表单
}
?>
</body></html>

members_only.php

<?php
session_start();
echo '<h1>members only</h1>';
if (isset($_SESSION['valid_user']))
{
echo '<p>you are logged in as '.$_SESSION['valid_user'].'</p>';
}
else
{
echo '<p>you are not logged in.</p>';
}
?>

logout.php

<?php
session_start();
$old_user = $_SESSION['valid_user'];
unset($_SESSION['valid_user']);
session_destroy();
?>
<html>
<body>
<h1>log out</h1>
<?php
if (!empty($old_user))
{
echo 'logged out.<br />';
}
else
{
echo 'you were not logged in,and so have not been logged out.<br />';
}
?>
</body></html>

-end-

Posted on

php数组

在计算机科学中,数组数据结构英语:array data structure),简称数组英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的储存地址。

1.一个数组就是一个用来存储一系列变量值的命名区域。

存储在数组中的值称为数组元素,每个数组元素有一个相关的索引,它可以用来访问元素。php允许间隔性地使用数字或字符串作为数组的索引。

2.数字索引数组

数字索引的默认值是从0开始的。
$products = array(‘p1′,’p2′,’p3’);//手工初始化
$numbers = range(1,10);//创建一个1~10的数字数组
如果信息保存在磁盘文件中,可以从这个文件直接载入到数组中。
如果信息保存在数据库中,可以从这个数据库中直接载入到数组中。
还可以使用不同函数提取数组中的一部分数据,或对数组进行重新排序。
访问数组:$products[0], 0元素是数组的第一个元素。
循环访问数组:for ($i = 0; $i<3; $i++ ) {echo $products[$i]." "; }

3.关联数组

初始化:$prices = array('p1' =>100, 'p2'=>10, 'p3'=>4);
访问数组:$prices['p1']
循环访问:foreach ($prices as $key => $valus){echo $key." - ".$value."<br />";}

4.多维数组

二位数组是一个矩阵,或者表格。
三维数组是一堆这样的表格。

5.数组排序

按升序排序:sort($products);
对关联数组排序:
按元素值:asort($prices);  按关键字排序:ksort($prices);
反向排序:以上三个函数的对应的反向函数是rsort();  arsort();  krsort();
随机排序:shuffle();
反向排序:array_reverse();

-end-

Posted on

lemp+phpmyadmin+wp+whmcs安装的坑

操作系统选择ubuntu14.04。

系统常用命令:

sudo service nginx restart
sudo service php5-fpm restart
sudo service php7.0-fpm restart
sudo tar xzvf xxx.tar.gz -C /dir
sudo ln -s /usr/share/phpmyadmin /usr/share/nginx/html
sudo chmod -R 777 /dir
sudo chown -R www-data:www-data /usr/share/nginx/html/
sudo rm -rf /dir
sudo mkdir -p /var/www/html

首先开心的用apt包管理器安装好nginx、mysql和php:

sudo apt-get update
sudo apt-get install nginx
sudo apt-get install mysql-server
sudo mysql_install_db                              //generate the directory structure it needs to store its databases and information.
sudo mysql_secure_installation          //security script
sudo apt-get install php5-fpm php5-mysql
设置nginx server blocks:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /usr/share/nginx/html;
    index index.php index.html index.htm;
    server_name server_domain_name_or_IP;
    location / {
        try_files $uri $uri/ =404;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

安装phpmyadmin:

sudo apt-get install phpmyadmin
在选择apache和httpd时按tab键跳过
sudo ln -s /usr/share/phpmyadmin /usr/share/nginx/html //把phpmyadmin目录链接到公开的web目录

安装wordpress:

把wp的执行用户设置为与nginx相同的www-data
sudo chgrp -R www-data /usr/share/nginx/html/
sudo chown -R www-data:www-data /usr/share/nginx/html/
建立wp的server blocks:

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;
        root /var/www/html;
        index index.php index.html index.htm;
        server_name your_domain.com;
        location / {
                # try_files $uri $uri/ =404;
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
        }
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

做一个软链接:
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
重启nginx和php

安装whmcs

安装php7.0
增加源
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
安装
sudo apt-get install php7.0-fpm
sudo apt-get install php7.0-mysql
在nginx配置中更新sock路径

  • PHP 5:/var/run/php5-fpm.sock
  • PHP 7:/var/run/php/php7.0-fpm.sock

配置文件目录

  • php5:/etc/php5/
  • php7:/etc/php/7.0

安装ioncube
sudo wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzvf ioncube_loaders_lin_x86-64.tar.gz -C /usr/ioncube/
修改php配置文件
sudo nano /etc/php/7.0/php.ini
加入一行
zend_extension = /usr/ioncube/ioncube/ioncube_loader_lin_7.0.so
安装破解文件,拷贝License.php到whmcs/vendor/whmcs/whmcs-foundation/lib

-end-

Posted on

后端工程师如何快速搭建前端页面

大部分的后端工程师每天和业务逻辑与数据库打交道,写不出有设计感的前端页面,只是略懂前端的3大语言,那么试试bootstrap这个前端框架吧。

在页面的head处插入下面代码就可以使用bootstrap了:

<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

这是bootstrap这个前端框架的优点,自动适用pc、手机、平板界面。.container 类用于固定宽度并支持响应式布局的容器。

栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局,你的内容就可以放入这些创建好的布局中。列(column)数是12。类前缀.col-xs-  .col-sm-  .col-md-  .col-lg- 同一行(row)后面跟的数字加起来要等于12.

包括菜单、输入框、导航等现成可用的组件。

实现一些动画和交互效果。

框架提供一些常用示例的现成代码页面,可以查看源码学习使用,也可修改后直接用到自己的项目中。