php curl 模拟上传遇到的小问题记录

今天在公司写东西的时候遇到了一个奇怪的小问题,就是在用 curl 模拟文件上传的时候发现上传失败,最初始采用的代码如下

[
    'file' => '@' . $fileName
]

通过查看文档发现了下面的一段说明

图片alt

从这可以得知,CURLOPT_SAFE_UPLOAD 这个参数可以控制,由于 php 5.5 以前的默认值是 false ,所以我可能以前并没有关注,但是在 php 5.6 的时候这个默认值是 true 了,所以当我们想要采用上面那种方式就需要设置 CURLOPT_SAFE_UPLOAD 这个值为 false 才可以使用。

但是需要注意的是在 php 7 以后这个属性被删除了,所以当我们想要上传的时候,必须采用 CURLFile 才可以上传。具体可以参见 http://php.net/manual/zh/class.curlfile.php

所以现在就不要考虑 CURLOPT_SAFE_UPLOAD 这个参数了,以后在模拟上传的时候直接采用 CURLFile 就可以了

升级 homestead 小记录

又是一个周末,自觉状态调整的不错了,于是就像弄点东西玩,然后,就想到了升级相关版本,vagrant 和 virtual box 都升级完了,然后我又升级了 homestea 的脚本,并且切换到了最新的 release tag 上,最后执行 vagrant box update,会提示 ==> homestead-7: Box 'laravel/homestead' not installed, can't check for updates. 这个么个东西,在网上简单的看了一下也没发现什么

最后灵机一动,切换会原来的 tag,然后再升级 box 再换到最新的 tag 就 ok 了。

哈哈,太机智了,记录一下顺序吧,以后就不会出问题了,先升级 box,然后升级 homestead 脚本,最后切换到脚本最新的 release 的 tag 就大功告成了,继续写代码

对了,升级以后还得重新配置一下 composer 中国镜像

用 php 来实现微信跳一跳 (适用于安卓手机)

作为一个程序员,当微信出了跳一跳后,排行榜的前三名就没有低于 1k 分的,我甚是伤心,所以 php 也要来跳一跳,今天发出来的版本貌似已经是第五版了,每天晚上都回家写一个方法,分数越来越高,到了现在,运行速度和分数都已经让我满意了。刚才打的最高分。

github 地址: https://github.com/crazyhl/php_jump_auto

分数

下面说一下实现的思路,先用 adb 截图,然后再这个截图上寻找小人的位置,以及需要跳跃到的方块的位置,最后再利用 adb 模拟长按跳过去就行了。

分开说下,如何找小人。利用先确认一个小人身上的色块的色值,然后在再整图上找这个色值区间值的一个范围。

如下图 图片alt

再调整色块值之后,我觉得这个范围比较合适,所以我就定了下来,然后再计算这个范围的中心点,当做小人的中心点。

然后再去寻找需要需要跳跃的目标,这里有个优化后的方法,首先我们确认了小人的位置,然后就搜索半张图就可以了,然后寻找两个点,跟标准值差异的最高点以及最右的一个点,为什么不寻找左侧点,是因为有阴影会影响搜索的。

等找到最高点和最右点之后,取两个点的交点就确认跳跃的目标点了。

这样人物点位和目标点都确认好了,然后利用勾股定理就可以计算出来距离了。这个距离跟最终的长按时间是有一个比例了,这个比例自己测一测就能大概找出来了。

这样,一个跟 php 没有太大关系的辅助就成了,最后,铺天盖地求 star

dijkstra算法 PHP 实现

20171119 利用周末优化了一下代码。这次完全默写了出来。感觉好多了

这个是根据算法图解自己写的,理解的不是很好,注释都在代码里面,过几天再默写一下,好好理解一下

<?php

// 构造图
$graphs = [];
$graphs['start'] = [];
$graphs['start']['a'] = 5;
$graphs['start']['b'] = 2;

$graphs['a'] = [];
$graphs['a']['c'] = 4;
$graphs['a']['d'] = 2;

$graphs['b'] = [];
$graphs['b']['a'] = 8;
$graphs['b']['d'] = 7;

$graphs['c'] = [];
$graphs['c']['d'] = 6;
$graphs['c']['fin'] = 3;

$graphs['d'] = [];
$graphs['d']['fin'] = 1;

$graphs['fin'] = [];

// 处理过的节点
$processed = [];
// 所有节点的消费
$costs = [];
// 所有节点的父节点
$parents = [];

function getNodeCost($graphs, $nodeName = 'start', $isStartNode = false)
{
    if (empty($graphs)) {
        return [];
    }
    $costs = [];
    foreach ($graphs[$nodeName] as $name => $length) {
        if ($isStartNode) {
            $costs[$name] = $length;
        } else {
            $costs[$name] = INF;
        }
        $costs += getNodeCost($graphs, $name);
    }

    return $costs;
}

$costs = getNodeCost($graphs, 'start', true);

function getNodeParents($graphs, $nodeName = 'start', $isStartNode = false)
{
    if (empty($graphs)) {
        return [];
    }
    $parents = [];
    foreach ($graphs[$nodeName] as $name => $length) {
        if ($isStartNode) {
            $parents[$name] = $nodeName;
        } else {
            $parents[$name] = null;
        }
        $parents += getNodeParents($graphs, $name);
    }

    return $parents;
}

$parents = getNodeParents($graphs, 'start', true);

function findLowestCostNode($costs, $processed)
{
    $lowestNodeLength = INF;
    $lowestNOdeName = '';
    foreach ($costs as $name => $length) {
        if ($length < $lowestNodeLength && !in_array($name, $processed)) {
            $lowestNodeLength = $length;
            $lowestNOdeName = $name;
        }
    }

    return $lowestNOdeName;
}

$nodeName = findLowestCostNode($costs, $processed);
while ($nodeName) {
    $currentNodeCost = $costs[$nodeName];
    foreach ($graphs[$nodeName] as $name => $length) {
        if ($currentNodeCost + $length < $costs[$name]) {
            $costs[$name] = $currentNodeCost + $length;
            $parents[$name] = $nodeName;
        }
    }
    $processed[] = $nodeName;
    $nodeName = findLowestCostNode($costs, $processed);
}

var_dump($costs);
var_dump($parents);

广度优先搜索 PHP 实现

直接上代码了,注释都在代码里面了。

<?php
/**
 * 广度搜索
 *
 * 你的朋友关系,以及朋友的朋友的关系,查看你的朋友或者朋友的朋友是不是包含 m 结尾的名字
 */

// 需要检索的数组
$graph = [];
$graph['you'] = ['alice', 'bob', 'claire'];
$graph['bob'] = ['anuj', 'peggy'];
$graph['alice'] = ['peggy'];
$graph['claire'] = ['thom', 'jonny'];
$graph['anuj'] = [];
$graph['peggy'] = [];
$graph['thom'] = [];
$graph['jonny'] = [];

// 搜索过的数组
$searchedItem = [];
// 待检索的数组
$waitSearchArray = [];
// 将第一层的关系加入到等待搜索的数组
$waitSearchArray = array_merge($waitSearchArray, $graph['you']);

// 将结果元素赋值为 false
$resultName = false;

//需要查找的字符
$findChar = 'z';

// 如果等待搜索的数组不为空就循环查找
while ($waitSearchArray) {
    // 从队列头部弹出一个元素
    $name = array_shift($waitSearchArray);
    // 如果待检查的元素在已经搜索过的数组中,就跳过,这个是用来防止循环检查的
    if (in_array($name, $searchedItem)) {
        continue;
    }
    // 获取最后一个字符
    $lastChar = substr($name, strlen($name) - 1, 1);
    // 如果最后一个字符是 m,就说明找到了,把结果赋值,然后跳出循环
    if ($lastChar == $findChar) {
        $resultName = $name;
        break;
    }

    // 到这里了说明没有找到,那么把这个人的名字,放入到已经搜索过的数组中
    $searchedItem[] = $name;
    // 然后再把这个名字的朋友关系加入到待搜索的数组中
    $waitSearchArray = array_merge($waitSearchArray, $graph[$name]);
}

var_dump($resultName);