鍍金池/ 問答/ PHP問答
陌南塵 回答
mix.webpackConfig({
    output: {
        publickPath: '/'
    }
})
笑浮塵 回答

很明顯這些是不可見字符, 最簡(jiǎn)單的辦法,做個(gè)類型判斷或直接使用正則替換,將非 d的替換為空

巴扎嘿 回答

直接foreach循環(huán)遍歷不就可以了么?

凹凸曼 回答

根據(jù) Github 上的文檔用 composer 安裝 https://github.com/Maatwebsit... 插件,從數(shù)據(jù)庫取出表數(shù)據(jù)作為二維數(shù)組,即可導(dǎo)出。

哚蕾咪 回答

需要你獲取到結(jié)果數(shù)據(jù)后再自行處理

紓惘 回答

app/Http/Controllers/Weather.php有這個(gè)文件嗎?

默念 回答

1. 如果只是單純地使用Redis作為cache組件:

'components' => [
    'cache' => [
        'class' => 'yii\redis\Cache',
    ],
],

只需要在配置文件中添加 keyPrefix 屬性即可:

'components' => [
    'cache' => [
        'class' => 'yii\redis\Cache',
        'keyPrefix' => 'webapp:'
    ],
]

2. 如果是直接使用Redis組件:

'components' => [
    'redis' => [
        'class' => 'yii\redis\Connection',
        'hostname' => 'localhost',
        'port' => 6379,
        'database' => 0,
    ],
],

這樣就沒有辦法實(shí)現(xiàn)自動(dòng)加前綴,只能自己去實(shí)現(xiàn)。

如果是我的話,我會(huì)單獨(dú)寫一個(gè)Redis的helper類,只在這個(gè) Redis helper類中調(diào)用 \Yii::$app->redis 組件。

Redis 基礎(chǔ)類,放一些基礎(chǔ)方法,各個(gè)數(shù)據(jù)類型都適用,每個(gè)數(shù)據(jù)類型都編寫一個(gè)子類,繼承這個(gè)類

class RedisBase
{
    /**
     * 這個(gè)方法中給 key 增加前綴
     * 所有與key相關(guān)的方法都要調(diào)用這個(gè)方法
     * @param $key
     * @return string
     */
    protected static function buildKey($key)
    {
        return \Yii::$app->params['redis.prefix'] . $key;
    }

    /**
     * @return \yii\redis\Connection
     */
    protected static function getRedis()
    {
        return \Yii::$app->redis;
    }

    /**
     * # exists key
     *
     * 檢查key是否存在
     * @param string $key
     * @return bool
     */
    public static function exists($key)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();
        return (bool) $redis->exists($key);
    }

    /**
     * # del key [key2 key3 …]
     *
     * 刪除指定數(shù)據(jù)
     *
     * @param string $key
     * @param bool $strict
     * 是否使用嚴(yán)格模式
     * true: 當(dāng)指定鍵不存在時(shí),返回false
     * false: 當(dāng)指定鍵不存在時(shí),但會(huì)true
     * @return bool
     */
    public static function del($key, $strict = false)
    {
        $key = self::buildKey($key);

        // 非嚴(yán)格模式,當(dāng)指定鍵不存在時(shí),但會(huì)true
        if (! $strict && ! self::exists($key)) return true;

        $redis = self::getRedis();
        return (bool) $redis->del($key);
    }

    /**
     * # expire key seconds
     *
     * 設(shè)置 key在seconds秒后過期
     *
     * @param $key
     * @param $seconds
     * @return bool
     */
    public static function expire($key, $seconds)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();
        return (bool) $redis->expire($key, $seconds);
    }

    /**
     * # ttl key
     *
     * 大于等于0時(shí),表示剩余過期秒數(shù)
     * -1 表示key存在,并且沒有過期時(shí)間
     * -2 表示key已經(jīng)不存在了
     *
     * 查看key的剩余過期時(shí)間
     * @param $key
     * @return int
     */
    public static function ttl($key)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();
        return (int) $redis->ttl($key);
    }

    /**
     * # dbsize
     *
     * 當(dāng)前db 鍵的總數(shù)量
     * @return int
     */
    public static function dbSize()
    {
        $redis = self::getRedis();
        return (int) $redis->dbsize();
    }

    // ... 其他redis基礎(chǔ)方法
}

Redis 字符串類型的方法,單獨(dú)放置在RedisString類中,繼承 RedisBase 方法

class RedisString extends RedisBase
{

    /**
     * # SET key value options
     *
     * 設(shè)置指定 key 的值
     *
     * @param $key
     * @param $value
     * @param array $options
     *
     * EX seconds -- 設(shè)置指定key的過期時(shí)間,以秒為單位
     * PX milliseconds -- 設(shè)置指定key的過期時(shí)間,以毫秒為單位
     * NX -- 只有在key不存在的情況下才設(shè)置.
     * XX -- 只有在key存在的情況下才設(shè)置.
     *
     * eg: ['NX', 'EX', '3600']
     *
     * @return bool
     */
    public static function set($key, $value, array $options = [])
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();
        $param = array_merge([$key, $value], $options);
        return (bool) call_user_func_array([$redis, 'set'], $param);
    }

    /**
     * # GET key
     *
     * 獲取指定 key 的值。
     * @param $key
     * @return string
     */
    public static function get($key)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();
        return $redis->get($key);
    }

    // ...其他String類型的方法
}

Redis 集合類型的方法,單獨(dú)放置在RedisSet類中,繼承 RedisBase 方法

class RedisSet extends RedisBase
{
    /**
     * # SADD key member1 [member2]
     *
     * 向集合添加一個(gè)或多個(gè)成員
     *
     * @param $key
     * @param $members
     * @return int 成功添加數(shù)量
     */
    public static function sAdd($key, $members)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();

        // php >= 5.6
        return (int) $redis->sadd($key, ...(array) $members);

        // 通用寫法
//        $params = array_merge([$key], (array) $members);
//        return (int) call_user_func_array([$redis, 'sadd'], $params);
    }

    /**
     * # SREM key member1 [member2]
     *
     * 移除集合中一個(gè)或多個(gè)成員
     * @param $key
     * @param $members
     * @return int
     */
    public static function sRem($key, $members)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();

        $params = array_merge([$key], (array) $members);
        return (int) call_user_func_array([$redis, 'srem'], $params);
    }

    /**
     * # SISMEMBER key member
     *
     * 判斷 member 元素是否是集合 key 的成員
     * @param $key
     * @param $member
     * @return bool
     */
    public static function sIsMember($key, $member)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();

        return (bool) $redis->sismember($key, $member);
    }

    /**
     * # SMEMBERS key
     *
     * 返回集合中的所有成員
     * @param $key
     * @return array
     */
    public static function sMembers($key)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();

        return $redis->smembers($key);
    }

    /**
     * # SCARD key
     *
     * 獲取集合的成員數(shù)
     * @param $key
     * @return bool
     */
    public static function sCard($key)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();

        return (int) $redis->scard($key);
    }
    
    // ...其他Set類型的方法

Redis 有序集合類型的方法,單獨(dú)放置在RedisSortedSet類中,繼承 RedisBase 方法

class RedisSortedSet extends RedisBase
{
    /**
     * # ZADD key score1 member1 [score2 member2]
     *
     * 向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù)
     * @param $key
     * @param array $options
     * [
     *     'value1' => score1,
     *     'value2' => score2,
     *     'value3' => score3,
     * ]
     *
     * @return int
     */
    public static function zAdd($key, array $options)
    {
        $key = self::buildKey($key);
        $redis = self::getRedis();
        $param = [$key];

        foreach ($options as $value => $score) {
            $param[] = $score;
            $param[] = $value;
        }

        return (int) call_user_func_array([$redis, 'zadd'], $param);
    }
    
    // ...其他SortedSet類型的方法
}

Redis List類型的方法,單獨(dú)放置在RedisList類中,繼承 RedisBase 方法

class RedisList extends RedisBase
{
    // ...方法省略
}

Redis Hash類型的方法,單獨(dú)放置在RedisHash類中,繼承 RedisBase 方法

class RedisHash extends RedisBase
{
    // ...方法省略
}

這樣寫的好處:

1.在調(diào)用redis的原始方法前,可以對(duì)數(shù)據(jù)進(jìn)行預(yù)處理
2.后期維護(hù)方便,若想修改,只需要修改這里的方法即可
3.方便添加一些注釋信息
4.這種方法對(duì)IDE更友好,可以直接跳轉(zhuǎn)到這個(gè)類中的方法,若處處使用 \Yii::$app->redis,則會(huì)比較難維護(hù)

另外,關(guān)于Redis的一些數(shù)據(jù)類型,可以查看Redis學(xué)習(xí)筆記 - 數(shù)據(jù)類型與API

拮據(jù) 回答

謝邀,為什么不考慮下把用戶的完整圖片縮小至300300,放到你要合成的圖片的左側(cè)呢?如果真的只要圖片居中300300的那部分,也很簡(jiǎn)單。假設(shè)用戶上傳的圖的長(zhǎng)、寬分別是w,h,你在使用imagecopyresampled函數(shù)把用戶圖片放到你要合成的圖上的時(shí)候,原圖的坐標(biāo)x,y分別是用(w-300)/2,(h-300)/2即可得到用戶上傳圖片的置中300*300的那塊。

裸橙 回答

<?php
$phpvar ="讀10000個(gè)string文章內(nèi)容由資料庫";
?>

<script>
alert('<?php echo $phpvar;?>');
</script>

陪妳哭 回答

php只是服務(wù)端的東西,不可能獲取到客戶端的東西,需要前端app給你提供信息就可以,h5是無法獲取用戶端信息的。所以得做個(gè)app來讀取,比如你可以用mui,5+ sdk有接口可以獲取通訊錄。

尛曖昧 回答

前車之鑒

方案1:websocket

前端開個(gè)長(zhǎng)連接,后臺(tái)統(tǒng)計(jì)長(zhǎng)連接時(shí)間。

方案2:ajax輪詢

隔幾秒發(fā)一個(gè)查詢,后臺(tái)記錄第一與最后一個(gè)查詢間隔時(shí)間

念初 回答

php很多數(shù)組原生函數(shù)的函數(shù)原型也是對(duì)數(shù)組循環(huán)處理,除非你的數(shù)組極其龐大復(fù)雜,否則foreach不會(huì)出現(xiàn)什么效率問題

短嘆 回答

在請(qǐng)求的頭部添加X-CSRF-TOKEN。這個(gè)值在第一次請(qǐng)求頁面時(shí)服務(wù)器自動(dòng)返回的。
文檔寫的很清楚嘛

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
不討囍 回答
  1. 從方便將來維護(hù)的角度考慮,專門存儲(chǔ)這些數(shù)據(jù)是值得的。
  2. 至于存儲(chǔ)方式,可以用表,也可以用配置文件;可以一條一條存,也可以一堆數(shù)據(jù)存到一起。
墨小白 回答

可以嘗試先重啟nginx,如果還沒有,分享我的做法,因?yàn)槲沂枪P記放在印象筆記里,所有拷貝黏貼可能少點(diǎn)東西
附件:
1:在/創(chuàng)建swoole目錄
2:cd /swoole
3:tar zxvf swoole-src-2.0.10-stable.tar.gz (解壓)
4:cd swoole-src-2.0.10-stable
5:/usr/local/php/bin/phpize (phpize路徑根據(jù)實(shí)際情況來)
6: ./configure --with-php-config=/usr/local/php/bin/php-config (下圖為結(jié)果)

7: make && make install (下圖為結(jié)果)

8:make test (下圖為結(jié)果)

如圖,error,報(bào)錯(cuò)了,這個(gè)時(shí)候翻譯報(bào)錯(cuò)內(nèi)容為,php.ini文件里的proc_open()被禁用了,找出來,允許他 (ini一般在/usr/local/php/etc下)

如圖,他禁用了很多函數(shù),老子這暴脾氣當(dāng)場(chǎng)就
然后重啟下fpm和nginx

發(fā)現(xiàn)重啟沒報(bào)錯(cuò),繼續(xù)執(zhí)行make test 結(jié)果如下

我們發(fā)現(xiàn)make test后,出現(xiàn)很多fail,如big_package_memory_leak [tests/swoole_client_async/big_package_memory_leak.phpt]等
,但我不知道怎么辦

我嘗試重啟了一下php-fpm,又重啟了一下nginx,發(fā)現(xiàn)Nginx有個(gè)報(bào)錯(cuò),又執(zhí)行了一下,發(fā)現(xiàn)沒問題,等下看看后續(xù)會(huì)不會(huì)有影響

既然沒法解決make test帶來的fail,我決定直接看看swoole安裝上了沒有
執(zhí)行了php-m發(fā)現(xiàn)沒有swoole,此時(shí)想起一個(gè)東西,extension=swoole.so,
在php.ini的最后一行加上extension=swoole.so
重啟php-fpm和nginx
執(zhí)行php -m

別急,在看看phpinfo

已經(jīng)安裝上了

注:下面還有個(gè)參考資料,可以參考,不過我沒試過
https://www.cnblogs.com/taiko...

替身 回答

你composer install/update的時(shí)候看一下啊 那個(gè)庫在下載的時(shí)候報(bào)什么錯(cuò)

哎呦喂 回答

你這是json嗎?多了一個(gè)'"',最后少了一個(gè)'}'

故人嘆 回答

option選項(xiàng)沒有給value賦值

另外建議不要使用@,這是一個(gè)較差的習(xí)慣,影響性能不說,容錯(cuò)能力也不好
建議你增加容錯(cuò)判斷,你剛剛也就發(fā)現(xiàn)了值有問題了,對(duì)吧

囍槑 回答

解決方案

一般可以看到都是include進(jìn)來的,或者說是拼接渲染, 你所說的new一個(gè) 或者 另外給function 那就違背了MVC了。

第三方SDK

一般的第三方都提供線上文檔以及接口描述,你可以自己去看文檔然后集成,也可以去packagist找包,通過Composer來幫你管理。

就拿支付寶來說 官方提供的SDK并沒有按照PSR4的規(guī)范來實(shí)現(xiàn)自動(dòng)載入,所以你需要手動(dòng)引入文件,然后根據(jù)官方的文檔來實(shí)現(xiàn)。
然而大多數(shù)情況下 我們并不需要那么完整的SDK ,這個(gè)時(shí)候 我們就可以根據(jù)我們自己的業(yè)務(wù)需求去封裝一下。

設(shè)計(jì)模式

樓上所說的設(shè)計(jì)模式 記住 MVC 不屬于設(shè)計(jì)模式。