整理了一份招PHP高级工程师的面试题,php高级工程师
1. 基本知识点
。。。
Include require include_once require_once 的区别.
PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。
Php代码
- MySQL:
-
- 一、从 4.0 到 4.1 的主要变化
-
- 如果在4.1.0到4.1.3版本的MySQL中创建了包含 TIMESTAMP 字段的 InnoDB表。则在升级到4.1.4及更高时需要重建表,因为存储格式发生变化了。
-
- 字符串根据标准SQL来比较:比较之前不删除末尾的空格,以前用末尾空格扩展了比较短的字符串。现在的结果是
-
- 'a' > 'a\t',以前则不这样。可以用 mysqlcheck 来检查一下数据表。
-
- TIMESTAMP 返回 'YYYY-MM-DD HH:MM:SS' 格式的字符串。在MySQL 4.0中,可以增加选项 --new 来获得ySQL 4.1中这方面的特性。
-
- 在MySQL4.1.1前,语句解析器不是那么严格,它在处理字符串转时间转换时会忽略第一个数字前的其他字符。在4.1.1之后,就比较严格了,返回结果是 DATE, DATETIME, 或 TIME 类型的函数的结果会被转换成时间型
-
- 二、再看从 4.1 到 5.0 的主要变化
-
- ◆InnoDB 和 MyISAM 表中空格结尾的 TEXT 字段索引顺序改变了。因此需要运行"CHECK TABLE" 语句修复数据表,如果出现错误,就运行 "OPTIMIZE TABLE" 或 "REPAIR TABLE" 语句修复,甚至重新转储(用mysqldump)。
-
- ◆MySQL 5.0.15开始,如何处理 BINARY 字段中填充的值已经改变了。填充的值现在是0x00 而非空格了,并且在取值的时候不会去除末尾的空格。
-
- ◆从MySQL 5.0.3开始,DECIMAL 的实现方式已经改变了,5.0对 DECIMAL的格式限制严格多了。在MySQL 5.0.3到5.0.5之间版本的 MyISAM 和 InnoDB 表中创建的 DECIMAL字段升级到5.0.6之后会发生崩溃。从5.0.3开始,DECIMAL 用更有效的格式来存储。5.0.3开始,在计算 DECIMAL 值和舍入精确值的时候采用精确数学。
-
- ◆在以前,等待超时的锁会导致 InnoDB回滚当前全部事务,从5.0.13开始,就只回滚最近的SQL语句了。
-
- ◆在4.1.13/5.0.8以前,DATETIME 的加0后就转换成 YYYYMMDDHHMMSS 格式,现在变为YYYYMMDDHHMMSS.000000 格式了
-
- ◆4.1中,FLOAT 或 DOUBLE 之间的比较碰巧没问题,但在5.0中可能就不行了
-
- ◆从5.0.3开始,VARCHAR 和 VARBINARY 字段中末尾的空格不再删除
-
- ◆增加了一个新的启动选项 innodb_table_locks,它导致 LOCK TABLE 时也可以请求InnoDB 表锁。这个选项默认打开,不过可能在 AUTOCOMMIT=1 和 LOCK TABLES应用中会导致死锁。看来,我只需主要关注 时间(TIMESTAMP, DATETIMEDATE, TIME) 和数值型(FLOAD, DOUBLE, DECIMAL) 这两种类型的变化;另外,我升级过程中暂时还不需要涉及到字符集问题,因此相对轻松一些。
-
- 升级步骤如下:
-
- 执行
-
- FLUSH TABLES WITH READ LOCK;
-
- 直接拷贝 MyISAM 表文件
-
- 用 mysqldump 导出 Innodb 类型的表
-
- 整个过程都很顺利,新系统启动之后,发现如下2个问题:
-
- 新增了关键字 INOUT,因此需要检查表结构中还有其他什么字段使用关键字了
-
- DATE_FORMAT 函数要求严谨多了,
-
- DATE_FORMAT('2006/11/24 09:14:00', '%Y-%m-%d %T')
- 和DATE_FORMAT('2006/11/2409:14:00', '%Y-%m-%d %T')
-
- 的结果完全不一样,在 4.0 中,能兼容这两种格式,而在 5.0 中,只能正确的使用前者了,后者则会有问题。这也应该是上面提到的时间类型发生的变化所致。
PHP:
Php代码
- PHP5以下几个改进值得关注:
- 1、极大地提高了面向对象能力;
- 2、支持try/catch异常处理;
- 3、改进了字符串地处理;
- 4、改经了xml和web服务支持;
- 5、对SQlite内置支持。
HEREDOC介绍
Php代码
- Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。但是现在的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实现了界面与代码的准分离,phpwind模板就是一个典型的例子。
-
- 1.以End开始标记开始,以End结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可。
-
- 2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接,如下:
-
- $v=2;
- $a=
- "abc"$v
- "123"
- EOF;
- echo $a;
-
- 3.heredoc常用在输出包含大量HTML语法d文档的时候。比如:函数outputhtml()要输出HTML的主页。可以有两种写法。很明显第二种写法比较简单和易于阅读。
-
- function outputhtml(){
- echo "";
- echo "主页";
- echo "主页内容";
- echo ";
- }
-
- function outputhtml()
- {
- echo
-
- 主页
- 主页内容
-
- EOT;
- }
-
- outputhtml();
-
- 在heredoc中会自动替换其中的$变量,将命令和输入放在一块,方便
写出一些php魔幻方法;
Php代码
- php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。
- PHP中的魔术方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload
- 1、__get、__set
- 这两个方法是为在类和他们的父类中没有声明的属性而设计的
- __get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名
- __set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值
- 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
- 2、__isset、__unset
- __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
- __unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
- 与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
- 3、__call
- __call( $method, $arg_array ) 当调用一个未定义的方法是调用此方法
- 这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方法,如果本类中不存在__call()方法就去找父类中的__call()方法
-
- 4、__autoload
- __autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
- 如果要定义一个全局的自动加载类,则必须用spl_autoload_register()方法将处理类注册到PHP标准库:
- view plaincopy to clipboardprint?
-
- class Loader
- {
- static function autoload_class($class_name)
- {
- }
- }
-
- spl_autoload_register(array('Loader', 'autoload_class'));
-
- $a = new Test();
-
- ?>
- 注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误,所以应该在函数本身做捕获。
- 5、__construct、__destruct
- __construct 构造方法,当一个对象创建时调用此方法,相对于PHP4使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称
- __destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数允许你在使用一个对象之后执行任意代码来清除内存。当PHP决定你的脚本不再与对象相关时,析构函数将被调用。
- 在一个函数的命名空间内,这会发生在函数return的时候。
- 对于全局变量,这发生于脚本结束的时候。
- 如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.
- 6、__clone
- PHP5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。
- 7、__toString
- __toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时。
- 如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in
- 此方法必须返回一个字符串。
- 在PHP 5.2.0之前,__toString方法只有结合使用echo() 或 print()时 才能生效。PHP 5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将一个未定义__toString方法的对象 转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。
- 8、__sleep、__wakeup
- __sleep 串行化的时候用
- __wakeup 反串行化的时候调用
- serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
- 使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
- 相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
- 使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
- 9、__set_state
- 当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
- 本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。
- 10、__invoke
- 当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
- PHP5.3.0以上版本有效
- 11、__callStatic
- 它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,
- PHP5.3.0以上版本有效
- PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此
一些编译php时的configure 参数
Php代码
- ./configure
- –prefix=/usr/local/php php 安装目录
- –with-apxs2=/usr/local/apache/bin/apxs
- –with-config-file-path=/usr/local/php/etc 指定php.ini位置
- –with-mysql=/usr/local/mysql mysql安装目录,对mysql的支持
- –with-mysqli=/usr/local/mysql/bin/mysql_config mysqli文件目录,优化支持
- –enable-safe-mode 打开安全模式
- –enable-ftp 打开ftp的支持
- –enable-zip 打开对zip的支持
- –with-bz2 打开对bz2文件的支持
- –with-jpeg-dir 打开对jpeg图片的支持
- –with-png-dir 打开对png图片的支持
- –with-freetype-dir 打开对freetype字体库的支持
- –without-iconv 关闭iconv函数,种字符集间的转换
- –with-libxml-dir 打开libxml2库的支持
- –with-xmlrpc 打开xml-rpc的c语言
- –with-zlib-dir 打开zlib库的支持
- –with-gd 打开gd库的支持
- –enable-gd-native-ttf 支持TrueType字符串函数库
- –with-curl 打开curl浏览工具的支持
- –with-curlwrappers 运用curl工具打开url流
- –with-ttf 打开freetype1.*的支持,可以不加了
- –with-xsl 打开XSLT 文件支持,扩展了libxml2库 ,需要libxslt软件
- –with-gettext 打开gnu 的gettext 支持,编码库用到
- –with-pear 打开pear命令的支持,php扩展用的
- –enable-calendar 打开日历扩展功能
- –enable-mbstring 多字节,字符串的支持
- –enable-bcmath 打开图片大小调整,用到zabbix监控的时候用到了这个模块
- –enable-sockets 打开 sockets 支持
- –enable-exif 图片的元数据支持
- –enable-magic-quotes 魔术引用的支持
- –disable-rpath 关闭额外的运行库文件
- –disable-debug 关闭调试模式
- –with-mime-magic=/usr/share/file/magic.mime 魔术头文件位置
- cgi方式安装才用的参数
- –enable-fpm 打上php-fpm 补丁后才有这个参数,cgi方式安装的启动程序
- –enable-fastcgi 支持fastcgi方式启动php
- –enable-force-cgi-redirect 同上 ,帮助里没有解释
- –with-ncurses 支持ncurses 屏幕绘制以及基于文本终端的图形互动功能的动态库
- –enable-pcntl freeTDS需要用到的,可能是链接mssql 才用到
- mhash和mcrypt算法的扩展
- –with-mcrypt 算法
- –with-mhash 算法
- –with-gmp
- –enable-inline-optimization
- –with-openssl openssl的支持,加密传输时用到的
- –enable-dbase
- –with-pcre-dir=/usr/local/bin/pcre-config perl的正则库案安装位置
- –disable-dmalloc
- –with-gdbm dba的gdbm支持
- –enable-sigchild
- –enable-sysvsem
- –enable-sysvshm
- –enable-zend-multibyte 支持zend的多字节
- –enable-mbregex
- –enable-wddx
- –enable-shmop
- –enable-soap
- PHP配置选项完整列表
- 数据库选项
- –with-dbplus
- 包括 dbplus 的支持。
- –with-adabas[=DIR]
- 包括 Adabas D 的支持。DIR 是 Adabas 的基本安装目录,默认为 /usr/local。
- –with-sapdb[=DIR]
- 包括 SAP DB 的支持。DIR 是 SAP DB 的基本安装目录,默认为 /usr/local。
- –with-solid[=DIR]
- 包括 Solid 的支持。DIR 是 Solid 的基本安装目录,默认为 /usr/local/solid。
- –with-ibm-db2[=DIR]
- 包括 IBM DB2 的支持。DIR 是 DB2 的基本安装目录,默认为 /home/db2inst1/sqllib。
- –with-empress[=DIR]
- 包括 Empress 的支持。DIR 是 Empress 的基本安装目录,默认为 $EMPRESSPATH。自 PHP4 起,本选项仅支持 Empress 8.60 及以上版本。
- –with-empress-bcs[=DIR]
- 包括 Empress Local Access 的支持。DIR 是 Empress 的基本安装目录,默认为 $EMPRESSPATH。自 PHP4 起,本选项仅支持 Empress 8.60 及以上版本。
- –with-birdstep[=DIR]
- 包括 Birdstep 的支持。DIR 是 Birdstep 的基本安装目录,默认为 /usr/local/birdstep。
- –with-custom-odbc[=DIR]
- 包 括用户自定义 ODBC 的支持。DIR 是 ODBC 的基本安装目录,默认为 /usr/local。要确认定义了 CUSTOM_ODBC_LIBS 并且在 include 目录中有某个 odbc.h。例如,对于 QNX 下的 Sybase SQL Anywhere 5.5.00,在运行 configure 脚本之前应该先定义以下环境变量: CPPFLAGS=”-DODBC_QNX -DSQLANY_BUG” LDFLAGS=-lunix CUSTOM_ODBC_LIBS=”-ldblib -lodbc”.
- –with-iodbc[=DIR]
- 包括 iODBC 的支持。DIR 是 iODBC 的基本安装目录,默认为 /usr/local。
- –with-esoob[=DIR]
- 包括 Easysoft OOB 的支持。DIR 是 OOB 的基本安装目录,默认为 /usr/local/easysoft/oob/client。
- –with-unixODBC[=DIR]
- 包括 unixODBC 的支持。DIR 是 unixODBC 的基本安装目录,默认为 /usr/local。
- –with-openlink[=DIR]
- 包括 OpenLink ODBC 的支持。DIR 是 OpenLink 的基本安装目录,默认为 /usr/local。这和 iODBC 一样。
- –with-dbmaker[=DIR]
- 包括 DBMaker 的支持。DIR 是 DBMaker 的基本安装目录,默认为最新版 DBMaker 安装的目录(例如 /home/dbmaker/3.6)。
- –disable-unified-odbc
- 取消对 unified ODBC 的支持。仅适用于激活了 iODBC,Adabas,Solid,Velocis 或用户自定义 ODBC 界面。仅能用于 PHP 3!
- 图像选项
- –without-gd
- 禁用 GD 支持。仅用于 PHP 3!
- –with-imagick
- Imagick 扩展被移到 PEAR 中的 PECL 中去了,可以在这里找到。PHP 4 中的安装指示可以在 PEAR 站点中找到。
- 只用 –with-imagick 仅在 PHP 3 中支持,除非依照 PEAR 站点的指示去做。
- –with-ming[=DIR]
- 包括 ming 支持。
- 杂类选项
- –enable-force-cgi-redirect
- 激活服务器内部重定向的安全检查。如果是在 Apache 中以 CGI 方式使用 PHP 则应该使用此选项。
- –enable-discard-path
- 使用此选项可以使 PHP 的 CGI 可执行程序安全地放置在 web 目录树以外的地方,并且别人也不能绕过 .htaccess 的安全设置。
- –with-fastcgi
- 将 PHP 编译成 FastCGI 应用程序。
- –enable-debug
- 编译时加入调试符号。
- –with-layout=TYPE
- 设置安装后的文件布局。TYPE 可以是 PHP(默认值)或者 GNU。
- –with-pear=DIR
- 将 PEAR 安装在 DIR 目录中(默认为 PREFIX/lib/php)。
- –without-pear
- 不安装 PEAR。
- –enable-sigchild
- 激活 PHP 自己的 SIGCHLD 句柄。
- –disable-rpath
- 禁止传递附加的运行时库搜索路径。
- –enable-libgcc
- 激活显式 libgcc 连接。
- –enable-php-streams
- 包含试验的 PHP 流。除非是测试源代码,否则不要使用!
- –with-zlib-dir=;
- 定义 zlib 的安装路径。
- –with-aspell[=DIR]
- 包含 ASPELL 支持。
- –with-ccvs[=DIR]
- 包含 CCVS 支持。
- –with-cybercash[=DIR]
- 包含 CyberCash 支持。DIR 是 CyberCash MCK 的安装目录。
- –with-icap[=DIR]
- 包含 ICAP 支持。
- –with-ircg-config
- ircg-config 脚本的路径。
- –with-ircg
- 包含 ircg 支持。
- –enable-mailparse
- 包含 mailparse 支持。
- –with-muscat[=DIR]
- 包含 muscat 支持。
- –with-satellite[=DIR]
- 激活通过 Satellite(试验性质)的 CORBA 支持。DIR 是 ORBit 的主目录。
- –enable-trans-sid
- 激活透明的 session id 传播。
- –with-regex[=TYPE]
- 使用系统 regex 库(不赞成)。
- –with-vpopmail[=DIR]
- 包含 vpopmail 支持。
- –with-tsrm-pthreads
- 使用 POSIX 线程(默认值)。
- –enable-shared[=PKGS]
- 编译共享库 [default=yes]。
- –enable-static[=PKGS]
- 编译静态库 [default=yes]。
- –enable-fast-install[=PKGS]
- 为快速安装而优化 [default=yes]。
- –with-gnu-ld
- 假定 C 编译器使用 GNU ld [default=no]。
- –disable-libtool-lock
- 避免锁死(可能会破坏并行编译)。
- –with-pic
- 尝试只使用 PIC/non-PIC 对象 [default=use both]。
- –enable-memory-limit
- 编译时加入内存限制支持。
- –disable-url-fopen-wrapper
- 禁止通过 URL 的 fopen wrapper,不能通过 HTTP 或 FTP 访问文件。
- –enable-versioning
- 仅输出所需要的符号。更多信息见 INSTALL 文件。
- –with-imsp[=DIR]
- 包含 IMSp 支持(DIR 是 IMSP 的 include 目录和 libimsp.a 目录)。仅用于 PHP 3!
- –with-mck[=DIR]
- 包含 Cybercash MCK 支持。DIR 是 cybercash mck 编译目录,默认为 /usr/src/mck-3.2.0.3-linux。帮助见 extra/cyberlib。仅用于 PHP 3!
- –with-mod-dav=DIR
- 包含通过 Apache 的 mod_dav 的 DAV 支持。DIR 是 mod_dav 的安装目录(仅用于 Apache 模块版本!)仅用于 PHP 3!
- –enable-debugger
- 编译入远程调试函数。仅用于 PHP 3!
- –enable-versioning
- 利用 Solaris 2.x 和 Linux 提供的版本控制与作用范围的优势。仅用于 PHP 3!
- PHP 选项
- –enable-maintainer-mode
- 激活将编译规则和未使用的(以及一些混淆的)依赖文件放入临时安装中。
- –with-config-file-path=PATH
- 设定 php.ini 所在的路径,默认为 PREFIX/lib。
- –enable-safe-mode
- 默认激活安全模式。
- –with-exec-dir[=DIR]
- 安全模式下只允许此目录下执行程序。默认为 /usr/local/php/bin。
- –enable-magic-quotes
- 默认激活 magic quotes。
- –disable-short-tags
- 默认禁止简写的 PHP 开始标记 。
- 服务器选项
- –with-aolserver=DIR
- 指定已安装的 AOLserver 的路径。
- –with-apxs[=FILE]
- 编译共享 Apache 模块。FILE 是可选的 Apache 的 apxs 工具的路径,默认为 apxs。确保指定的 apxs 版本是安装后的文件而不是 Apache 源程序中包中的。
- –with-apache[=DIR]
- 编译 Apache 模块。DIR 是 Apache 源程序的最高一级目录。默认为 /usr/local/apache。
- –with-mod_charset
- 激活 mod_charset 中的传递表(Apache 中)。
- –with-apxs2[=FILE]
- 编译共享的 Apache 2.0 模块。FILE 是可选的 Apache 的 apxs 工具的路径,默认为 apxs。
- –with-fhttpd[=DIR]
- 编译 fhttpd 模块。DIR 是 fhttpd 的源代码路径,默认为 /usr/local/src/fhttpd。
- –with-isapi=DIR
- 将 PHP 编译为 ISAPI 模块用于 Zeus。
- –with-nsapi=DIR
- 指定已安装的 Netscape 服务器路径。
- –with-phttpd=DIR
- 暂无信息。
- –with-pi3web=DIR
- 将 PHP 编译为用于 Pi3Web 的模块。
- –with-roxen=DIR
- 将 PHP 编译为一个 Pike 模块。DIR 是 Roxen 的根目录,通常为 /usr/local/roxen/server。
- –enable-roxen-zts
- 编译 Roxen 模块,使用 Zend Thread Safety。
- –with-servlet[=DIR]
- 包含 servlet 支持。DIR 是 JSDK 的基本安装目录。本 SAPI 需要 java 扩展必须被编译为共享的 dl。
- –with-thttpd=SRCDIR
- 将 PHP 编译为 thttpd 模块。
- –with-tux=MODULEDIR
向php传入参数的两种方法。
(mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
Sql代码
- char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
-
- char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).
-
- 在MySQL中用来判断是否需要进行对据列类型转换的规则
-
- 1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.
- 2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.
- 3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.
- 例外:长度小于4个字符的char数据列不会被转换为varchar类型
-
- 一个定长
- 一个不定长
- a char(10)
- b varchar(10)
- 都存入'abc'
- a 10字节
- b 3字节
error_reporting 等调试函数使用
您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?
posix和perl标准的正则表达式区别;
Php代码
- 正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串 。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容 。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的在正则表达式引擎。正则表达式这个概念最初是由 Unix中的工具软件(例如sed和grep)普及开的。(摘自维基百科)
-
- PHP同时使用两套正则表达式规则,一套是由电气和电子工程师协会(IEEE)制定的POSIX Extended 1003.2兼容正则(事实上PHP对此标准的支持并不完善),另一套来自PCRE(Perl Compatible Regular Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip Hazel。
-
- 使用POSIX兼容规则的函数有:
- ereg_replace()
- ereg()
- eregi()
- eregi_replace()
- split()
- spliti()
- sql_regcase()
- mb_ereg_match()
- mb_ereg_replace()
- mb_ereg_search_getpos()
- mb_ereg_search_getregs()
- mb_ereg_search_init()
- mb_ereg_search_pos()
- mb_ereg_search_regs()
- mb_ereg_search_setpos()
- mb_ereg_search()
- mb_ereg()
- mb_eregi_replace()
- mb_eregi()
- mb_regex_encoding()
- mb_regex_set_options()
- mb_split()
-
- 使用PERL兼容规则的函数有:
- preg_grep()
- preg_replace_callback()
- preg_match_all()
- preg_match()
- preg_quote()
- preg_split()
- preg_replace()
-
- 定界符:
-
- POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。
-
- PERL兼容正则可以使用任何不是字母、数字或反斜线(\)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 作为定界符
-
- 修正符:
-
- POSIX兼容正则没有修正符。
-
- PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):
-
- i (PCRE_CASELESS):
- 匹配时忽略大小写。
-
- m(PCRE_MULTILINE):
- 当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前。
-
- s(PCRE_DOTALL):
- 如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。
-
- x(PCRE_EXTENDED):
- 如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。
-
- e:
- 如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。
-
- A(PCRE_ANCHORED):
- 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。
-
- D(PCRE_DOLLAR_ENDONLY):
- 如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面。如果设定了 m 修正符则忽略此选项。
-
- S:
- 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。
-
- U(PCRE_UNGREEDY):
- 使“?”的默认匹配成为贪婪状态的。
-
- X(PCRE_EXTRA):
- 模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。
-
- u(PCRE_UTF8):
- 模式字符串被当成UTF-8。
-
- 逻辑区隔:
-
- POSIX兼容正则和PERL兼容正则的逻辑区隔符号作用和使用方法完全一致:
- []:包含任选一操作的相关信息。
- {}:包含匹配次数的相关信息。
- ():包含一个逻辑区间的相关信息,可被用来进行引用操作。
- |:表示“或”,[ab]和a|b是等价的。
-
- 元字符与“[]”相关:
-
- 有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号“[]”内被识别的。
-
- POSIX兼容正则和PERL兼容正则“[]之外”“一致”的元字符:
- \ 有数种用途的通用转义符
- ^ 匹配字符串的开头
- $ 匹配字符串的结尾
- ? 匹配0或者1
- * 匹配 0 个或多个前面指定类型的字符
- + 匹配 1 个或多个前面指定类型的字符
-
- POSIX兼容正则和PERL兼容正则“[]之外”“不一致”的元字符:
- . PERL兼容正则匹配除了换行符外的任意一个字符
- . POSIX兼容正则匹配任意一个字符
-
- POSIX兼容正则和PERL兼容正则“[]之内”“一致”的元字符:
- \ 有数种用途的通用转义符
- ^ 取反字符,但仅当其为第一个字符时有效
- - 指定字符ASCII范围,仔细研究ASCII码,你会发现[W-c]等价于[WXYZ\\^_`abc]
-
- POSIX兼容正则和PERL兼容正则“[]之内”“不一致”的元字符:
- - POSIX兼容正则中[a-c-e]的指定会抛出错误。
- - PERL兼容正则中[a-c-e]的指定等价于[a-e]。
-
- 匹配次数与“{}”相关:
-
- POSIX兼容正则和PERL兼容正则在匹配次数方面完全一致:
- {2}:表示匹配前面的字符2次
- {2,}:表示匹配前面的字符2次或多次,默认都是贪婪(尽可能多)的匹配
- {2,4}:表示匹配前面的字符2次或4次
-
- 逻辑区间与“()”相关:
-
- 使用()包含起来的区域是一个逻辑区间,逻辑区间的主要作用是体现出一些字符出现的逻辑次序,另一个用处就是可以用来引用(可以将此区间内的值引用给一个变量)。后一个作用比较奇特:
-
- $str = "http://www.163.com/";
- echo ereg_replace("(.+)","\\1",$str);
- echo preg_replace("/(.+)/","$1",$str);
- ?>
-
- 在引用的时候,括号是可以嵌套的,逻辑次序是按照“(”出现的次序来标定的。
-
- 类型匹配:
-
- POSIX兼容正则:
- [:upper:]:匹配所有的大写字母
- [:lower:]:匹配所有的小写字母
- [:alpha:]:匹配所有的字母
- [:alnum:]:匹配所有的字母和数字
- [:digit:]:匹配所有的数字
- [:xdigit:]:匹配所有的十六进制字符,等价于[0-9A-Fa-f]
- [:punct:]:匹配所有的标点符号,等价于 [.,"'?!;:]
- [:blank:]:匹配空格和TAB,等价于[ \t]
- [:space:]:匹配所有的空白字符,等价于[ \t\n\r\f\v]
- [:cntrl:]:匹配所有ASCII 0到31之间的控制符。
- [:graph:]:匹配所有的可打印字符,等价于:[^ \t\n\r\f\v]
- [:print:]:匹配所有的可打印字符和空格,等价于:[^\t\n\r\f\v]
- [.c.]:功能不明
- [=c=]:功能不明
- [:<:>
- [:>:]:匹配单词的结尾
-
- PERL兼容正则(这里可以看出PERL正则的强大):
- \a alarm,即 BEL 字符(’0)
- \cx "control-x",其中 x 是任意字符
- \e escape(’0B)
- \f 换页符 formfeed(’0C)
- \n 换行符 newline(’0A)
- \r 回车符 carriage return(’0D)
- \t 制表符 tab(’0)
- \xhh 十六进制代码为 hh 的字符
- \ddd 八进制代码为 ddd 的字符,或 backreference
- \d 任一十进制数字
- \D 任一非十进制数的字符
- \s 任一空白字符
- \S 任一非空白字符
- \w 任一“字”的字符
- \W 任一“非字”的字符
- \b 字分界线
- \B 非字分界线
- \A 目标的开头(独立于多行模式)
- \Z 目标的结尾或位于结尾的换行符前(独立于多行模式)
- \z 目标的结尾(独立于多行模式)
- \G 目标中的第一个匹配位置
Safe_mode 打开后哪些地方受限.
写代码来解决多进程/线程同时读写一个文件的问题。
Php代码
- 大家都知道,PHP是没有多线程概念的,尽管如此我们仍然可以用“不完美”的方法来模拟多线程。简单的说,就是队列处理。通过对文件进行加锁和解锁,来实现。当一个文件被一个用户操作时,该文件是被锁定的,其他用户只能等待,确实不够完美,但是也可以满足一些要求不高的应用。
- function T_put($filename,$string){
- $fp = fopen($filename,’a');
- if (flock($fp, LOCK_EX)){
- fputs($fp,$string);
- flock($fp, LOCK_UN);
- }
- fclose($fp);
- }
- function T_get($filename,$length){
- $fp = fopen($filename,’r');
- if (flock($fp, LOCK_SH)){
- $result = fgets($fp,$length);
- flock($fp, LOCK_UN);
- }
- fclose($fp);
- return $result;
- }
写一段上传文件的代码。
Mysql 的存储引擎,myisam和innodb的区别。
Sql代码
- 简单的表达。
- MyISAM 是非事务的存储引擎。
- innodb是支持事务的存储引擎。
-
- innodb的引擎比较适合于插入和更新操作比较多的应用
- 而MyISAM 则适合用于频繁查询的应用
-
- MyISAM
- innodb
- MyISAM 不会出现死锁。
-
- 最大的区别就是MYISAM适合小数据,小并发;INNODB 适合大数据,大并发。最大的区别就是在锁的级别上。
-
- MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。综述,就可以根据数据表不同的用处是用不同的存储类型。而且MyISAM是文件存储的,可以进行直接在不同操作系统间拷贝使用。
-
- InnoDB:
- InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,可以拷贝文件或用navicat for mysql。
-
- MyISAM
- 每张MyISAM 表被存放在三个文件 :frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。
- 因为MyISAM相对简单所以在效率上要优于InnoDB,小型应用使用MyISAM是不错的选择。
- MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦
2. web 架构,安全,项目经验
3. unix/linux 基本使用
4. 前端,HTML,JS
以下哪一句不会把 John 新增到 users 阵列?
$users[] = 'john';
成功把 John 新增到阵列 users。
array_add($users,’john’);
函式 array_add() 无定义。
array_push($users,‘john’);
成功把 John 新增到阵列 users。
$users ||= 'john';
语法错误。
2.sort()、assort()、和 ksort() 有什么分别?它们分别在什么情况下使用?
sort()
根据阵列中元素的值,以英文字母顺序排序,索引键会由 0 到 n-1 重新编号。主要是当阵列索引键的值无关疼痒时用来把阵列排序。
assort()
PHP 没有 assort() 函式,所以可能是 asort() 的笔误。
asort()
与 sort() 一样把阵列的元素按英文字母顺序来排列,不同的是所有索引键都获得保留,特别适合替联想阵列排序。
ksort()
根据阵列中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的联想阵列。
3.以下的代码会产生什么?为什么?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由于函式 multiply() 没有指定 $num 为全域变量(例如 global $num 或者 $_GLOBALS['num']),所以 $num 的值是 10。
4. reference 跟一个正规的变量有什么分别?如何 pass by reference?在什么情况下我们需要这样做?
Reference 传送的是变量的地址而非它的值,所以在函式中改变一个变量的值时,整个应用都见到这个变量