原码,反码,补码介绍
原码:
就是“数学意义”上的一个整数的二进制的原来(本来)的形式。
其中,又在计算机中有一个规定:一个二进制数字(比如32位),最左边的一位是符号位:
0表示是正数;
1表示是负数;
原码举例:
3就是:00000000 00000000 00000000 00000011
5就是:00000000 00000000 00000000 00000101
-3就是:10000000 00000000 00000000 00000011
-5就是:10000000 00000000 00000000 00000101
反码:
这样规定:
正数的反码就是其原码本身(即不变);
负数的反码是:符号位不变,其他所有位取反(~)所得到的结果:
3的反码就是: 00000000 00000000 00000000 00000011
5的反码就是: 00000000 00000000 00000000 00000101
-3的反码就是: 11111111 11111111 11111111 11111100
-5的反码就是: 11111111 11111111 11111111 11111010
补码:
这样规定:
正数的补码就是其原码本身(即不变);
负数的补码是:符号位不变,反码加1,(即原码基础上其他所有位取反后加1):
3的补码就是: 00000000 00000000 00000000 00000011
5的补码就是: 00000000 00000000 00000000 00000101
-3的补码就是: 11111111 11111111 11111111 11111101
-5的补码就是: 11111111 11111111 11111111 11111011
举一例:
4的原码:00000000 00000000 00000000 00000100
-4的原码:10000000 00000000 00000000 00000100
-4的反码:11111111 11111111 11111111 11111011
-4的补码:11111111 11111111 11111111 11111100
位运算的一个典型应用:
目标:
“管理”一组具有开关状态的“数据”(事物)。
开关状态:就是只有2个状态,比如true/false,“是/否”, “开/关”,“来/去”
一组:就是指多个,若干个——自然应该是有一个明确的个数
假设:
有5个灯泡,需要管理。这5个灯泡,有个编号顺序,它们的管理需求是:
1,指定任意一盏灯泡的当前状态;
2,能够打开任意指定的一盏灯泡;
3,能够关闭任意指定的一盏灯泡;
案例1:
运行结果:
案例2:
运行结果:
案例3:
前言
这篇文章适合所有的PHP开发新手、老鸟以及想准备学习开发 PHP 的程序猿。众所周知,PHP 是 Web 编程最流行的编程语言,如果有人告诉你,有 Serverless 的 PHP WEB 开发新模式,你是不是会感到好奇和兴奋?在介绍 Serverless Web 开发新模式之前,我们先了解下将 PHP Web Serverless 化的好处:
无需采购和管理服务器等基础设施弹性伸缩,动态扩容免运维, 极大降低人力成本按需付费,财务成本低
本文以部署 WordPress 工程在函数计算环境中为例,向您讲解如何使用阿里云函数计算快速构建或移植基于 PHP 框架开发的 Web ,通过本文,您将会了解以下内容:
案例概览传统服务器架构 VS Serverless架构Serverless架构详解函数计算运行PHP框架原理案例开发配置步骤FC Web 设置自定义域名
案例概览
在本教程中,我们讲解如何利用函数计算一步一步来构建 Web 的 Server 端,该案例是把一个 WordPress 部署到函数计算,本文旨在展示函数计算做 Web Backend 能力,具体表现为以下几点:
完善的 PHP 系统迁移到 FC 的成本不高FC 打通了专有网络 VPC 功能,用户的函数可以配置访问专有网络的云资源,比如本案例中 MYSQL, NAS
案例体验入口:
体验地址: http://1986114430573743.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/share/wp-func/账号:wp-test密码:wp-pwd
传统服务器架构 VS Serverless架构
正常来说,用户开发Server端服务,常常面临开发效率,运维成本高,机器资源弹性伸缩等痛点,而使用Serverless架构可以很好的解决上述问题。下面是传统架构和Serverless架构的对比:
阿里云函数计算是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询,性能监控,报警等功能。借助于函数计算,您可以快速构建任何类型的应用和服务,无需管理和运维。
Serverless 架构详解
从上面的示例图中,整体架构十分简单明了, 用 FC 替代了 Web 服务器,但是换来的是免运维,弹性扩容,按需付费等一系列优点
函数计算运行 PHP 框架原理
传统服务器 PHP 运行原理
原理示意图
A simple nginx conf
从上面原理示意图我们可以看出,Web 服务器根据conf 中 location将 PHP 脚本交给 php-fpm 去解析,然后将解析后的结果返回给 client 端
FC 驱动 PHP 工程原理
函数计算的执行环境相当于传统 web 服务的 Apache/Nginx用户函数相当于实现 Apache/Nginx 的 conf 中 location用户将 Web 网站部署在 NAS,然后挂载 NAS 到函数的执行环境, 比如下面代码中 /mnt/www目录对于 WordPress 入口函数代码就是这么简单, 建议您先了解下 PHP RuntimePHP 入口函数PHP 执行环境
其中函数计算为用户提供了一个 $GLOBALS['fcPhpCgiProxy']对象用来和 php-fpm 进行交互,对
PHP 工程中的 php 文件进行解析,该对象提供了两个重要的接口:
requestPhpCgi
案例开发配置步骤
准备工作
由于函数运行时的 IP 是不固定的,您需要设置 RDS 允许所有 IP 访问。但是这样会有风险,不建议这样做。在本教程中,我们将创建一个 RDS MYSQL 数据库,并将它置于一个专有网络 VPC 环境内,函数计算支持 VPC 功能,用户可以通过授权的方式安全地访问 VPC 中的资源(同时包含本示例中的 NAS )。
1. 创建 RDS MYSQL 数据库, 配置 VPC , 具体参考通过 VPC 访问 RDS 实例
2. 创建 NAS 挂接点,配置 VPC (注意:这里跟 RDS 采用相同的 VPC), 具体参考函数计算nas使用示例
3. 可选操作,在准备函数的 region 创建日志,用于函数的调试, 具体参考函数计算配置日志服务
创建函数
创建 Service (假设是 share ), 配置准备 vpc config , nas config和日志服务,比如案例体验的Service配置如下图:
2. 下载 WordPress, 然后将 WordPress 工程移到上述配置的 NAS 中, www 表示 WordPress 的工程的根目录
index.py代码:
基于上述代码创一个函数 move-wp-nas , 执行函数,将 WordPress 工程包移动到 NAS 的/mnt/www/2016-08-15/proxy/share/wp-func目录。
Q1: 为什么创建 /2016-08-15/proxy/share/wp-func 这么奇怪的目录?
A:因为http trigger, 函数访问的格式为下面的url: http://${account_id}.${region}.fc.aliyuncs.com/2016-08-15/proxy/$(seevice_name}/{function_name}/,为了保证从一个页面跳转到另外一个页面的时候,能自动带上/2016-0815/proxy/$(seevice_name}/{function_name}/,我们需要建立这样目录和设置 cgi 相关参数达到 PHP 框架内部自动跳转正确的问题。
Q2: 可不可以不用/2016-08-15/proxy/share/wp-func这么奇怪的目录?
A:可以,等函数计算自定义域名功能上线,可以解决这个问题,具体操作后续会在此文中更新。
3. 创建入口函数 wp-func (对应上面步骤中的 /mnt/www/2016-08-15/proxy/share/wp-func ), 给函数设置 http trigger ,类型为 anonymous , 类型都选上。
4. 直接通过 url 访问首页,第一次访问会提示您安装 WordPress, 安装过程中配置之前准备好的数据库、管理员等相关信息, 安装成功后,就可以成功访问首页,登录后台管理 WordPress 网站了。
总结
函数计算有如下优势:
无需采购和管理服务器等基础设施专注业务逻辑的开发提供日志查询、性能监控、报警等功能快速排查故障以事件驱动的方式触发应用响应用户请求毫秒级别弹性伸缩,快速实现底层扩容以应对峰值压力按需付费。只需为实际使用的计算资源付费,适合有明显波峰波谷的用户访问场景
除了上面所列的优势,FC 可以做为 Web Backend,只需要编写一个函数实现传统 Web 服务器中的 conf 中的逻辑,就可以将一个完整的 Web 工程迁移到 FC ,从而从传统的 Web 网站运维,监控等繁琐的事务中解放出来。
1.比较运算符
2.案例求两个数最大值
3.逻辑运算符
4. 案例求平年闰年
$year%4==0 && $year%100!=0 || $year%400==0
5. 赋值运算符
6.案例:交换两个变量值
7.字符串运算符
8.案例:平年闰年
浮动元素和文本的关系:
说明:文本是不会钻入到浮动元素下面的。 div背景颜色会插入到浮动元素的下面
清除浮动:
clear: 清除浮动 属性值left、right、both(清楚左右浮)
清除浮动的目的:当浮动完成(布局完成),再回来,再落回普通文档流上。
写法:在浮动元素的下面(紧挨着)添加一个空的div,这个div就用来清除上面元素浮动的,直接给div加清除浮动的属性
案例:
1.标准选择器:通配符选择器、标记选择器、类选择器、id选择器
通配符选择器语法:*{color:red;}注意:通配符是选择上所有的标记,。通配符包括body里的样式,但是少用,IE6不支持案例:
标记选择器:说明:直接写标记名当成选择器来使用,选择器哪个标记当前这个页面中所有这个标记都会发生改变语法:标记名{color:red}案例:
类选择器:又称“class选择器”在写class选择器时必须加点(.)建议不管是某个还是某些标记都使用类的方法说明:每个html标记都有一个公共属性,class属性配合css使用的,这个class属性就是给某个或某些标记加一类样式语法:class属性的值{color:red;}注意:类名可以给不同的标记加上,这个时候这些标记统称一类案例:
id选择器说明:每个html标记都有一个公共的属性id,每个id必须时唯一的语法:#id 的值{color:red;}注意:id选择器只是给一个标记加样式,一般用js的动态效果使用,id和class时分开使用的,id给js使用,class给css使用案例:
2.复杂选择器:多元素选择器、后代选择器、子类选择器、伪类选择器
多元素选择器:说明:把css的基本选择器进行组合,组合成多种选择器方式语法:div,ul,li,.class,#id,{color:red;}注意:大型网站一般都用多元素来替代通配符,每个选择器用英文逗号隔开案例:
后代选择器:说明:在制作网站时会出现嵌套的形式,有可能时多级嵌套,而且每个多级里面标记还相同,这个时候就可以用某个标记中的某个内容语法:第一层 第二层 第三层。。。。{color:red}注意:如果某一层有相同的标记都会选择,需要每层都写清楚 p标记中不能嵌套一些块元素案例
子类选择器:说明:就是选择一代(子孙)不能隔代语法:父类(选择器)>子类(选择器){color:red;}案例:
伪类选择器:说明:给超链接加样式的方法:<a href=”#”></a>link:默认状态hover:放上状态active:当点击时的状态(不放手)visited:访问过的状态语法:选择器状态{color:fed}注意:一般是默认状态和访问过状态设置成一样的效果 所有的标记都可以加伪类选择器案例:
未经允许不得转载:分享吧 03 php学习之css选择器(二)
说明:常量一旦定义,里面的值和常量是不能改变和销毁的,而且常量名不能重复
1.常量的定义:
语法:define(常量名,常量值);不能定义复合数据
5.xphp版本:const来定义复合的数据,如数组7.0 php版本:define可以定义复合的数据.如:define(ARR,[1,2,3,4,5]);
2访问常量
说明:直接使用常量名就可以了.。如:echo NAME;
常量的使用:网站的配置文件中使用。如:当前网站路径
3.魔术常量—预定义常量
__LINE__:文件中的当前行号__FILE__:文件的完整路径和文件名,如果用在被包含的文件中,则返回被办好的文件名,自php4.0.2起,__FILE__总是包含一个绝对路径.如果是符号连接,则是解析后的绝对路径,而在此前的版本有时会包含一个相对路径__DIR__:文件所在目录。如果用在被包括文件中,则返回被包括的文件所在目录,它等价于dimame(__FILE__)除非是i根目录。赋值目录中名不包括末尾斜杠__FUNCTION__:函数名称,php4.3.0新增,php5起本常量返回该函数被定义时的名字(区分大小写)在php4中该值总是小写__CLASS__:类的名称__TRAIT__:trait的名称__METHOD__:类的方法名__NAMESPACE__:当前命名空间的名称mvc:URL传递数据:index.php:c=getuser&a=xxxx&m=index
产生随机数的函数:rand()
说明:rand:产生一个随机整数
intrand(void)
int rand(int $min, int $max)
<?php/*** @Author: admin* @Date: 2018-08-12 22:56:43* @Last Modified by: admin* @Last Modified time: 2018-08-12 23:39:54*///常量的定义define('NAME','张三');define('PI',3.14);echo NAME,PI;const USER='admin';echo USER;//__CLASS__:获取当前类名class getuser{function index(){include './xx/index.html';}function add(){include './xxx/index.html';}}//rand()随机函数$num=rand(1,100);//随机生成1-100的整数echo $num;
题:
变量处理常用的函数有哪些? 举例说出至少四个,并各举一个案例说明unset如何在函数内部就销毁一个全局变量,请使用的代码来说明如何销毁PHP基本数据类型的值传递和引用传递的区别是什么,请画出对应的内存示意图一个页面server.php,并输出至少5个$_SERVER内的元素信息,并说明是什么含义,页面表现形式如下:元素名称 使用形式 结果 含义
PHP_SELF $_SERVER[‘PHP_SELF’] /test/$_SERVER.php 表示本网页路径
参考:PHP手册〉语言参考〉预定义变量〉$_SERVER
5.写一个表单,用来填写“用户信息”,要求出现所有的表单元素类型(除文件类型):
文本框,密码框,单选,复选,下拉,多行文本域,隐藏域
提交后显示用户所填写的所有数据。复选框的问题:都一个name值,复选框name是一个,问:怎么实现获取多个选项的值
答案:
1.变量常用的函数:
isset():案例:$user=isset($_GET[‘user’])?$_GET[‘user’]:”;//判断是否存在
unset():案例:$a=1; unset($a);//销毁变量a
empty():案例:$a=1;if(empty($a)){echo “存在”};//判断是否为空
echo:案例:$a=1;echo $a;//打印a
var_dump():案例:$a=1; var_dump($a);//打印a
2.用unset销毁在函数中的全局变量
//只销毁局部变量$a=1;function demo(){global $a;//把全局变量局部声明echo $a;unset($a);//销毁变量aecho $a;}demo();//变量a被销毁echo $a;//a的值存在正常打印//销毁全局变量function un(){global $a;//声明局部变量 unset($GLOBALS['a']); //echo $a;}un();echo $a;//a的值没有了
3.值传递和引用传递的区别
值传递,传递过去的是数值,
引用传递,传递的是地址值
4.新建一个server.php
<?php/*** @Author: admin* @Date: 2018-08-13 00:03:26* @Last Modified by: admin* @Last Modified time: 2018-08-13 01:13:03*/$arrayName = array('REQUEST_URI','SCRIPT_NAME','PHP_SELF','SERVER_ADMIN','SCRIPT_FILENAME');$arr2=array('URI 用来指定要访问的页面','包含当前脚本的路径','当前执行脚本的文件名',' Apache 服务器配置','当前执行脚本的绝对路径');echo "<table border=1>";echo '<tr>';echo '<th>元素名称</th><th>使用形式</th><th>结果</th><th>含义</th>';echo '</tr>';foreach ($arrayName as $key => $value) {echo '<tr>';echo '<td>'.$value.'</td>';echo "<td>\$_SERVER['$value']</td>";echo "<td>".$_SERVER[$value]."</td>";echo '<td>'.$arr2[$key].'</td>';echo '</tr>';}echo '</table>';
5.答案
大年初五,根据我们SINE安全的网站安全监测平台发现,thinkphp官方6.0版本被爆出高危的网站代码漏洞,该漏洞可导致网站被植入网站木马后门文件也叫webshell,具体产生的原因是session ID参数值这里并未对其做详细的安全过滤与校验,导致可以远程修改POST数据包将session的值改为恶意的后门代码,发送到服务器后端并生成PHP文件直接生成,可导致网站被攻击,服务器被入侵,关于该thinkphp漏洞的详情,我们SINE安全来跟大家分析一下。
thinkphp是国内用的比较多的一套开源系统,采用的是php+mysql架构开发,基于该框架的开发较容易与维护,深受很多站长以及企业的青睐,2018-2019年thinkphp的漏洞就层出不穷,像之前的3.23版本,ThinkPHP 5.0缓存漏洞、ThinkPHP 5.0.10、ThinkPHP5.0.12、ThinkPHP5.0.13、ThinkPHP5.0.23、thinkphp 5.0.22版本都存在这漏洞。
目前的新版本6.0存在着session任意文件上传漏洞,我们SINE安全工程师来进行详细的安全分析与代码的安全检测,再index控制器里我们发现可以写入session来进行控制代码,首先我们看下代码:如下图所示
以上代码是用来获取name的参数值并将值里的内容写到session中去,我们来本地搭建一套TP6.0版本的环境,来测试一下生成的session文件会到哪里去。http://测试网址/tp6/public/index.php/index/testsession?name=<?php%20phpinfo();?>当get 访问该页面的时候就会在网站根目录下的runtime文件夹里的session目录下生成一个PHP文件,我们可以看得到。那到底是那段代码导致可以写入文件名的呢?我们仔细看下TP框架里的store.php代码,追踪到253到270行这里,调用了一个参数来进行写入文件的操作,writefile($filename,$data)我们来追踪下这个函数接下来使用到是哪里的值,看下图:
原来是追踪到了sessionID值里去了,也就是POST数据包里的phpsessid,导致该值可以在远程进行伪造与篡改,漏洞利用截图:
经过我们SINE安全的网站安全测试发现,thinkphp的漏洞利用条件是服务器开启session功能,默认代码是不开启的,有些第三方开发公司在给客户网站以及平台开发的时候会用到session功能来控制用户的登录状态以及权限所属判断,可导致网站被攻击,被篡改,数据库内容被修改等攻击情况的发生,在这里我们建议网站的运营者对该代码漏洞进行修复,对session的判断以及写入做拦截与效验,不允许直接.php文件的session值写入,如果您对代码不是太懂的话也可以找专业的网站安全公司来帮您修复网站漏洞
1.css的介绍
css:层叠样式表,它是cascading style sheets的缩写,作用就是给html标签加表现形式(样式显示)
如:字体、图片、列表、位置等
在浏览器中可以看到部分:
html:超文本标记语言,主要作用把内容(图片、文字、视频等)放入网页中—网页结构css:层叠样式表,主要给html进行样式的显示。如何的布局—样式javascript:浏览器的脚本语言,主要作用给html加动态特效—行为css的特点:
可以非常准确的定位,定位某个或某些标记,给这些标记加样式
html和css代码分离,减少后期工作量
2.css基础
css基本语法
css样式表由语法规则组成,由多个语法规则组成样式表
一个css语法规则由“选择器”和“声明语句”组成
选择器:如何的精准的定位到某个或某些html标记的方法,选择器有很多种方式
声明语句:就是如何去给html标记加样式属性和值,每个声明语句用分号结束,多个声明语句用花括号括起来,这时候就是给某个或某些标记加这个里面的所有写的样式
css的引入方式1.内嵌方式:把css样式表通过一对标签写在html文件的head标签中,当成html的标记来使用,一般情况都是写在head中,不推荐写在别的地方
语法:<style type=”text/css”>语法规则</style>
案例:
<!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css">div{width:20px;height:20px;border:1px solid red;margin:10px; auto;} </style> </head> <body> </body></html>
2.行内方式:把css样式当成html的一个属性来写,如:<div style=”属性值”></div>
语法:<h1 style=”color:red; font-size:12px;”>1号标题</h1>
案例:
<p style="color:red; font-size:12px;">段落</p>
3.外链方式:把css样式表写到一个以.css为结尾的文件中(style.css),把这个文件引入到某一个html文件中,当前html文件就会有css的效果实现,好处:一个css可以给多个html文件使用
语法:
<link rel=”stylesheet” type=”text/css” href=”具体的css文件路径”>
案例:
<head><!--可以引入多个css文件,几个页面一样引入一个--><link rel="stylesheet" type="text/css" href="./style.css"></head>
4.@import:可以在一个css文件中再次引入一个css文件
语法:
@import url(“要引入的css文件路径”)
案例:
未经允许不得转载:分享吧 03 php学习之css入
案例:创建一个表单,输入任意数字,让其在二进制、十进制、十六进制之间互相转换
1.没有封装前的代码实现
封装的意义在于一次写成多次调用
各进制和其他进制的相互转换函数
decbin():十进制转二进制函数`dechex():十进制转八进制decoct():十进制转十六进制bin2hex():二进制转十六进制bindec():二进制转十进制octdec():八进制转十六进制hexdec():十六进制转十进制
任意进制转换 base_convert() 函数
tring base_convert ( string number, int frombase, int tobase )返回一字符串,包含 number 以 tobase 进制的表示。number 本身的进制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之间(包括 2 和 36)。高于十进制的数字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。
2.封装的方式
新建一个输入文件:input.html
新建一个函数库,用来存储函数decbin.php
新建一个change.php调用函数并输出结果
今天介绍一下网站里面常见的用户登录功能的实现
用户登录我们先想一想实现思路,先帮常用的代码放在一个include文件,里面放一些链接数据库,常用函数等公用文件。然后常用的用户信息修改。我们看看需要哪些页面
代码文件公用的头部文件和公用的底部文件单独放在一个页面,方便后期维护。然后就是登陆,注册,逻辑处理。
代码是最基础的实现原理。在原理掌握的基础长就可以进行深化,封装成class文件,简化代码和文件,我们先从最基础的实现原理来看看怎么实现。
登陆的界面首先是基本的登陆页面。不含css,后期可以把页面美化一下。
然后看看数据提交到了loginCheck.php页面进行哪些逻辑处理
php逻辑代码处理我们分析代码 显示引用配置文件,我们看看配置文件,也就是最基本的数据库信息,定义一个数组
数据库配置然后在看看mysql.fun.php通过文件名称我们可以知道这是一个操作数据库的代码,我们把一些常用的数据库操作方在这个里面。然后在去调用。
数据库链接操作注意@的用途,感兴趣的朋友去删除这个看看效果。
接着分析代码就是接受用户名和密码,执行查找数据库操作,存在这个记录就跳转到main.php页面,不存在就跳转到login.php页面。这样也就类似实现一个后台登陆管理功能的实现。登陆成功进入后台,登陆失败禁止登陆。原理是不是很简单。有兴趣的朋友快去制作一个登陆功能吧。
登陆后台模板小编收集了一下后台界面模板和登陆界面模板,想加强这方面的也去试试吧。
网站后台管理界面这样就实现了一个最基本的后台管理功能。