try catch的一点小体会这个日记里,写到了,如果数据库保存失败 ,save()仅仅返回一个false,因此要手动抛出异常。

但我现在遇到一个情况,就是在save()的时候,会报错,因为某个字段里有特殊字符,又没有做转义处理,就会报错。

而且如果是一个for loop里报错,这会导致for loop退出的,因此要catch这个错误,但不要throw,一旦throw,这个for loop还是中断了。仅仅catch这个错误,然后在console里写一个提示,即可。

好,问题来了:什么时候save()会报错呢?什么时候不会报错,但仅仅返回一个false

遇到一个问题,需要读取本地服务器里的文件,并且用PHPOffice解析出来。

问题来了,总是file not exist, 这他妈。。。。

后来发现是路径格式的问题,也就是说,PHPOffice\Phpspreadsheet这个库里的load函数,本质上是PHP的fopen函数,而这个又显然是C语言里的fopen函数的封装。至于PHP在封装的过程中是否做了什么优化,不得而知,但是呢,参数是文件路径或一个url,这就要求必须符合Windows的文件路径,或者Unix文件格式。

而在保存的过程中,死活是不能提取出合适的文件路径的,各种不对。于是我就放弃了直接在PHP代码里解决文件路径格式的问题。于是在console里写代码,传递的参数是Unix格式的路径,这就好了。

所以一方面,不能死板,二方面还是要多思考。这个解决方法是洗澡的时候想出来了。还是要多投入时间和精力。

出现这个问题,通常是php.ini的问题,当然,肯定也和Nginx或Apache的配置有关。
php.ini里有2个地方和这个有关:

671行 post_max_size = 50M
824行 upload_max_filesize = 50M

首先呢,一般的框架都会通过某种机制自动解析namespace,比如Yii里,最底层的namespaceapp,所有的Class都是在这个app之下的。

或者,Laravel框架里,什么都是在Illuminate这个namespace之下。

那么,如果想手动添加属于自己的namespace怎么办?

比如我写了一个库,我想把这个库的namespace命名为SuperPHP,咋办?
也不难,composer.json这个文件里有一个autoload,可以用来创建自己的namespace并且自动加载到整个框架里,使得任何地方都可以使用到你自己写的库。

{
    "autoload": {
        "psr-4": {
            "MyNamespce\\": "dirPath/"
        }
    }
}

注意,大小写是区分的,并且psr-4里边,keynamespacevalue文件路径

最后,用一个命令重新生成新的自动加载文件(autoloader files):

composer dump-autoload --optimize

摘抄自composer的文档:

--optimize (-o): Convert PSR-0/4 autoloading to classmap to get a faster autoloader. This is recommended especially for production, but can take a bit of time to run so it is currently not done by default.

2018年7月7日更新
autoload里还有一个东西,就是files,目的是在每一个request的时候都加载该文件,一般用于加载一些Helpers函数。

 "files": [
            "src/Helpers.php"
        ]

2018年11月19日更新

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

每次更新这个classmap这个,都要重新生成新的自动加载文件(autoloader files):

composer dump-autoload --optimize

一般如果做Google Adsense,需要验证网站,那么一般是在HTML代码里加Meta标签,或者在根目录下,加一个html文件验证。

验证的时候,要放在root directory,啥意思呢?比如,Laravel框架,要放在public里,Yii2框架要放在web里。

总之,是index.php所在的目录。

验证完毕后,这个html文件不要删了,因为Google还会时不时回头再查看一下。否则没有的话,就会导致网站重新回到未验证状态。