分类目录归档:未分类

php响应jsonp请求

jsonp是一种跨域请求解决方案,利用了 html 可以引入远程 js 的原理,实现跨域。

说白了,就是请求远程响应一个可执行的 js ,一般格式为一个callback对象(这里是一个js,只是看起来比较特殊): callback( $json )

优点:它的兼容性更好,在更加古老的浏览器中都 可以运行,不需要XMLHttpRequest或ActiveX的支持

缺点:它只支持GET请求而不支持POST等其它类型的HTTP请求;需要后端配合

一个完整的 php 响应 jsonp 的例子:

前端使用 jquery 请求,例如:(注意,必须使用 dataType: “jsonp”)

        $.ajax({
            url: masterDomain + "/include/ajax.php?service=job&action=invitation",
            data: {
                lease_day: ms_day,
                lease_halfa: ms_halfa,
                lease_hour: ms_hour,
                place: mplace,
                name: mcontact,
                phone: mphone,
                areaCode: areaCode,
                rid: id,
                pid: mzhiwei,
                remark: remark.join("、")+(remark2 ? "、"+remark2 : ""),
            },
            type: "GET",
            dataType: "jsonp",
            success: function (data) {
              if(data.state == 100){
                showMsg('已发送邀请');
                setTimeout(function(){
                   $('.popup-yqms').hide();
                },2000);
              }else{
                showMsg(data.info);
              }
            },
            error: function(){
              showMsg('网络错误,邀请失败!');
            }
        });

实际生成的请求参数:

service: job
action: invitation
callback: jQuery183005780949854490891_1661221971605
lease_day: 2022-08-26
lease_halfa: 上午
lease_hour: 07:00
place: 1050302
name: 朱丰华
phone: 18278069613
areaCode: 86
rid: 98
pid: 256
remark: 请携带简历、请带纸笔、请携带作品、请着正装、2321
_: 1661222005709

响应数据(一个对象):

jQuery36008420933829690445_1661223447342({"state":100,"info":"邀请成功!"})

php具体实现代码:

$callback = htmlspecialchars(RemoveXSS($callback));
$callback = str_replace(')', '', str_replace('(', '', $callback));


if($callback){
	if(isset($param['dataType'])){
		if($param['dataType'] == 'html'){
			echo $return['info'];
			return;
		}
	}
	echo $callback."(".json_encode($return, JSON_UNESCAPED_UNICODE).")";
}

总结:

jsonp,通常用于跨域请求js数据(不是js脚本),但利用了html请求js脚本的方式完成。

类似于在 html 中 <script src=”远程服务器 .php”></script> 。(也能返回 js 脚本,但是返回的数据不好处理)

使用 dataType : jsonp ,就是传递一个 callback 对象名,后端把响应数据加一个 对象名( $json ) 即可。

面试的英文是什么?

面试的英文单词是:interview

interview  

英 [‘ɪntəvjuː]  美 [‘ɪntɚvju]  

n. 接见,采访;面试,面谈

vt. 采访;接见;对…进行面谈;对某人进行面试

So, it is significant to research interview which used frequently on human resource selection。

正在面试 Interview in progress;Interview i progress;Interview Car in progress

压力面试stress interview;human resources Stress interview;PRESSURE INTERVIEW;stre interview

评价面试Appraisal interview;human resources Appraisal interview;A raisal interview

等待面试Waiting for an Interview

造句:

1、The televised interview was distilled from 20 hours of film. 

这段电视采访是从20小时的胶片中精选的。

2、The manager will interview the candidates in order of arrival. 

经理将按(到达)先后次序接见这些应征者。

3、The television interview will be aired to all parts of the country. 

这个电视采访节目将向全国各地播放。

PHP spl_autoload_register 多次调用

  spl_autoload_register 是注册php auto_load的函数,这个函数可以多次加载

    每一个函数应该都有返回值(boolean),如果返回值为true则认为已经加载成功就退出了加载过程,如果失败则继续调用后边的auto_load函数加载php文件,当然如果最后一个auto_load也没有加载成功这时候就没有加载完成,new的时候就会报错。

<?php
 
define('BASE_PATH',dirname(__FILE__).'/') ;
 
function cron_autoload1 ($name) {
    $file = BASE_PATH.'lib1/'.$name.'.class.php';
    if(file_exists($file)){
        include_once($file);
        return true;
    }
 
}
function cron_autoload2 ($name) {
    $file = BASE_PATH.'lib2/'.$name.'.class.php';
    if(file_exists($file)){
        include_once($file);
        return true;
    }
}
spl_autoload_register('cron_autoload1');
spl_autoload_register('cron_autoload2');
 
new Class1();
new Class2();
//该函数后面两个参数为
//此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。
//如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
spl_autoload_register('autoLoad',true,true);

//执行自动加载的方法
function autoLoad($class_name){
    echo PHP_EOL;
    echo "现在输出的类名为:".$class_name;
    echo PHP_EOL;
    include './index.php';
}
$obj = new ceshi();
$obj->run();

注:与 __autoload() 函数不同 , __autoload 从7.2开始已经启动,从8.0正式删除,而且它只可以调用一次。

前端设计、后端设计、架构师

前端设计,这里指从前端角度来看的设计,一些小公司更注重于页面的设计,按设计稿进行程序开发。

前端设计,是为了提高页面的美观,交互等。

后端设计和前端设计截然不同,后端程序员设计一个工程,会设计实体类之间的关系、数据ER图、数据流图等等

如果只是给你一些设计的页面稿,那么很难实现程序的完整开发,因为从纯前端的角度设计的东西并不完善,或者有错误,页面看起来没问题,逻辑大有问题。即使没问题,实现起来也进度缓慢,因为没有逻辑可言,设计师只给你几张图片,写代码?纯靠猜,一点点看,自己思考消化后,写完一看先后端对接又有些不同?纯前端设计是有一定弊端的,一些小公司的日常操作。

大公司有的可能要进行后端设计,因为每一个接口,都可能有海量请求,接口是否经得起考验,需要完善的逻辑推理,而不是简单的页面设计就能完成的。而且公司里有后端设计师,那么后端初级程序员只需要写实现代码就可以了,不用考虑太多逻辑相关东西,已经给你设计好了。

如果希望单独设计一个程序,那么一个优秀的程序,至少需要把各个层面都考虑,前端后端都要合理设计。

如果完整的程序设计,做得很熟练,就可以算是架构师了。(这也是不推荐去小公司的 一个原因,没有架构师,项目设计不合理)

从开发一个完整的网站到全栈开发工程师

前言:记录反复独立开发网站、app、应用程序的成长。

前端开发的成长。

前端的学习,从每一个小小标签开始,标签和属性记记背背,最基础的网页,就是不同标签的叠加。虽然有一些简单的样式,但始终感觉脑袋空空。

在独立写了无数项目,无数页面,后面想来,前端开发重在设计和样式。js是偏逻辑的,也就是偏后端,虽然js的重要性不言而喻,js占据前端的绝大部分,但是越研究js,就会让你更偏向后端,从而前端再无存进。

前端的灵魂,是每一个元素的设计,前端的元素是有共性的,一个 div 可以千变万化,可以是方的、圆的、动的,忽隐忽现的,甚至可以用div画图,把一个元素样式千锤百炼,千变万化时,再让你设计前端页面,简直手到擒来。前端的精髓:div 的千变万化,页面的设计

后端开发的成长。

最开始接触后端,感觉是最没用的,最简单的。

从一个最基础的增删改查来讲,后端接收前端传递来的参数,然后写入数据库,或从数据库获取消息,再返回给前端,无疑只是一个中间工具人:

前端 --请求--> 后端 --请求--> 数据库

前端<--响应-- 后端 <--响应-- 数据库

基于这样浅显的认识,后端开发也是长时间无存进。尽管代码愈加精炼和规范,各种设计模式也有样学样,代码封装得也非常简化。但是这些并没有让我成长,反而是越来越感到迷茫,永远有学不完的东西似的。

在经历的大量的编码,以及独立设计了多个应用框架,才终于慢慢明白。后端的精髓,在于逻辑控制,比如同样是从前端接收并发送到数据库,如果把一个步骤分成多个通用步骤,这样代码重用、耦合就更低,越是分层、分步骤控制的越精细,则越能驾驭庞大的系统。

写10个小系统,远远不如一个大型系统来得有难度,前者只是无用代码的反复堆积,而独立设计完成一个超大型系统,足以证明你有非常强大的后端能力。

数据库的学习成长。

曾经简单的认为,数据库只是一个存储数据的工具。在很长很长一段时间,都是使用文本存储。(这里的文本,并不是简单的按行文本,很多时候也是有格式的)认为数据库比较繁琐,比如一个非常小的系统,就用于记录密码,除了登录和密码列表外,再无其他功能,更是一度使用文本存储。

后来发现,无论是简单的数据库存储,还是文本存储,最大的困难就是不便于扩展,不灵活。

如果使用了数据库,那么可以设置无限的表,可以设置很多字段,扩展方便得多。当然,这一点即使是刚接触数据库的也能理解,但是真的深刻理解吗?

数据库不是简单的存储,最重要的是数据间的关系,以前为了简单,所有字段都存储到一张表中,或者说即使存到多张表了,也是按实际需求简单的分析了一下应该存储多个表。

要考虑数据间的关系,不一定要按照实际需求来分析,而是按数据本身,尽量把字段分离到合适的表,你的业务逻辑也将变得更加不一样。举个例子:一个公司有一个地址,一个职位有一个地址,通常来说我们认为不可划分,但如果我们强行划分了就会不一样,我们把每一个地址都记录下来作为地址库,这样新添加职位甚至可以从地址库中选择,一般的程序员都想不到这样设计,而对用户来说无疑是十分友好的。

从前面来看,多表的设计,数据间的关系,无疑是数据库能力提升的最佳体现。而不是多掌握几种数据库、记记背背一些语法,只要不得精髓永远停留在表面阶段。

全栈开发工程师。

web全栈开发,仍然是价值最高的。无论多专业的分工、前端和后端、设计都是经验饱满,但其效率,远不如全栈开发的50%,说50%都有点过了,综合有30%就不错了。做设计的,也可能设计不当(因为前端后端数并没有十分熟悉),前端和后端也可能难以沟通(只要是程序员,沟通肯定是有问题的),这样就导致了开发进度缓慢,而且最终成品含金量大大降低。

只是在国内,人数多。通常来说不缺程序员,也就导致全栈开发面临一个尴尬的局面,那就是:价值远被低估(或者说从未被重视)。

能力一般,则难以堪当重任,前端、后端等等都要十分熟练(一般程序员都是达不到的),还不如分别招几个专业些的程序员来得实在,毕竟各个方面都很牛的人几乎不存在,或非常稀少。所以真正牛逼的全栈开发你见不到,也很难成为这样的人。

php框架为什么使用public目录

虽然 php 框架都有唯一的入口,但是正常情况下的文件是暴露的。

比如大名鼎鼎的 wordpress 系统,你想知道一个网站到底是不是 wordpress 搭建,试试访问:

站点/wp-includes/

如果返回 403 ,则说明存在该目录,那么它肯定就是 wordpress 搭建的。

尽管从外表看不出来,但是它的文件并没有隐藏,所以容易被发现端倪。

或者说,一些指定的php文件,黑客不通过 index.php 路由,而是直接访问这些php文件,或者 html 模板等,这些信息不应该单独被访问到,但是又确实暴露了。

因此,一些成熟的框架,会使用 public 目录,只暴露该目录,其他目录是隐藏的,从而减少潜在的隐患,比如 thinkphp,laveral。

从安全的角度来看,仅暴露public目录,或许是更好的选择,除了历史遗留原因,基本上现在的框架都采用public目录的方式。

php默认的namespace

每个php文件都有一个namespace

缺省时,默认为 \

比如:

try{
  ...
}catch(\Exception $e){
   ...
}

这里的 \Exception 中的 \ 在当前命名空间也缺省的情况下可以缺省(此时也是 \)

如果当前有命名空间,则这里的 \Exception 中的 \ 必须,因为当前命名空间不是 \

PHP __NAMESPACE__ 常量

PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

__NAMESPACE__ 示例, 在命名空间中的代码

<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>

__NAMESPACE__ 示例,全局代码

<?php

echo '"', __NAMESPACE__, '"'; // 输出 ""
?>

常量 __NAMESPACE__ 在动态创建名称时很有用,例如:

使用__NAMESPACE__动态创建名称

<?php
namespace MyProject;

function get($classname)
{
    $a = __NAMESPACE__ . '\\' . $classname;
    return new $a;
}
?>

关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。

namespace操作符,命名空间中的代码

<?php
namespace MyProject;

use blah\blah as mine; // 引入了 blah\blah 命名空间,并定义了个别名mine

mine\mine(); // 调用函数 blah\blah\mine()
namespace\blah\mine(); // 调用函数 MyProject\blah\mine()

namespace\func(); // 调用函数 MyProject\func()
namespace\sub\func(); // 调用函数 MyProject\sub\func()
namespace\cname::method(); // 调用 MyProject\cname 类的静态方法
$a = new namespace\sub\cname(); // 实例化 MyProject\sub\cname 类的对象
$b = namespace\CONSTANT; // 将常量 MyProject\CONSTANT 的值赋给 $b
?>

namespace操作符, 全局代码

<?php

namespace\func(); // calls function func()
namespace\sub\func(); // calls function sub\func()
namespace\cname::method(); // calls static method "method" of class cname
$a = new namespace\sub\cname(); // instantiates object of class sub\cname
$b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
?>

vs code 极速下载

替换域名,为:vscode.cdn.azure.cn

原下载连接:https://az764295.vo.msecnd.net/stable/e4503b30fc78200f846c62cf8091b76ff5547662/VSCodeUserSetup-x64-1.70.2.exe

替换后:https://vscode.cdn.azure.cn/stable/e4503b30fc78200f846c62cf8091b76ff5547662/VSCodeUserSetup-x64-1.70.2.exe

官方地址:https://code.visualstudio.com/Download ,在这里你能得到原始下载链接,再进行替换即可飞速下载。

ElasticSearch搜索-响应结果说明

响应结果说明

GET http://localhost:9200/superz/_search

得到的响应结果一般如下所示:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.0,
    "hits": [
      {
        "_index": "superz",
        "_type": "test",
        "_id": "FSkX53ABV-8UrARgh4Dt",
        "_score": 1.0,
        "_source": {
          "name": "superz1",
          "sex": "男",
          "note": "this is a demo1"
        }
      }
    ]
  }
}

took

took 值反映执行整个搜索请求耗费了多少毫秒

timed_out

timed_out 值反映查询是否超时。默认情况下,搜索请求不会超时。如果低响应时间比完成结果更重要,则可以指定 timeout:

GET http://localhost:9200/superz/_search?timeout=10ms

在请求超时之前,elasticsearch 将会返回已经成功从每个分片获取的结果。

注意:应当注意的是 timeout 不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接。在后台,其他的分片可能仍在执行查询即使是结果已经被发送了。

_shards

_shards 部分返回的是在查询中参与分片的总数,以及这些分片成功了多少个,失败了多少个。正常情况下用户不希望分片失败,但是分片失败是可能发生的。如果用户遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。

hits

返回结果中最重要的部分就是 hits,它包含的 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档(在未使用分页的情况下)。

在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着用户可以直接从返回的搜索结果中使用整个文档。

每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。

max_score 值是与查询所匹配文档的 _score 的最大值。