对于一个项目,我正在使用Scala和Riak(我以前从未使用过的两件事;)).
谷歌搜索似乎建议使用Riakki.但是,似乎特定的库自2009年以来一直没有维护,甚至在我的系统上也没有编译.GitHub上有一个更新的分支,似乎可以使用更新的Scala版本.但Riakki似乎依赖于Jiak,自去年2月以来已被弃用.
似乎唯一合理的选择是使用Scala 的官方Riak Java库.这当然是可能的,但我想用Scala方式做事,因为我正在努力学习这门语言.必须与Java风格的API接口可能会破坏一些乐趣.写我自己的包装听起来像是太多的工作.
tl;博士:我想使用Scala的Riak.其他人使用什么?
编辑:刚刚找到Ryu(无法链接到它 - 对新用户的每个问题的超链接数量的烦人限制).虽然看起来不那么成熟.
我一直在使用phpsh一段时间了,过去它运行得很好.但它的命名空间支持仍然不是很好,这可能非常令人沮丧.
\Somespace\Someclass::someStaticFunction()在没有禁用检查是否存在方法的情况下,这样做是行不通的,这会导致重置环境的拼写错误导致频繁的致命错误.
有多个PHP REPL,包括PHP内置shell(php -a),使用起来很糟糕.
有没有人知道一个替代方案或者一个具有正确名称空间支持的phpsh-fork?或者也许是一个简单的配置修复我忽略了......
一个例子:
这个测试文件:
<?
namespace testing;
function echoSome(){
echo 'Something';
}
\testing\echoSome();
Run Code Online (Sandbox Code Playgroud)
在phpsh中生成此输出(如预期的那样)
php> include '/path/test.php';
Something
php>
Run Code Online (Sandbox Code Playgroud)
但是再次尝试相同的调用不起作用:
php> \testing\echoSome();
Not executing input: Possible call to undefined function echoSome()
See /etc/phpsh/config.sample to disable UndefinedFunctionCheck.
Run Code Online (Sandbox Code Playgroud)
没有命名空间,该功能仍然可用:
<?
function echoSome(){
echo 'Something';
}
echoSome();
Run Code Online (Sandbox Code Playgroud)
在phpsh中:
php> include '/path/test.php';
Something
Run Code Online (Sandbox Code Playgroud)
电话仍然有效:
php> echoSome();
Something
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用AWS SDK for PHP以编程方式将文件上传到设置为S3控制台中的静态网站的存储桶.
该桶名为foo.ourdomain.com,托管在欧洲西部.我正在使用以下代码尝试测试是否可以上传文件:
$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla));
$client->upload('foo.ourdomain.com', 'test.txt', 'hello world', 'public-read');
Run Code Online (Sandbox Code Playgroud)
这与示例中的非常相似,但是,我收到以下异常:
PHP致命错误:未捕获的Aws\S3\Exception\PermanentRedirectException:AWS错误代码:PermanentRedirect,状态代码:301,AWS请求ID: - ,AWS错误类型:客户端,AWS错误消息:您尝试访问的存储桶必须得到解决使用指定的端点.请将以后的所有请求发送到此端点:"foo.ourdomain.com.s3.amazonaws.com".,User-Agent:aws-sdk-php2/2.4.8 Guzzle/3.7.4 curl/7.22.0 PHP/5.3 .10-1ubuntu3.8
此时我感到很惊讶,因为在S3 SDK的手册中没有提到这一点.但好吧,我找到了一个方法setEndpoint并将代码调整为:
$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla));
$client->setEndpoint('foo.ourdomain.com.s3.amazonaws.com');
$client->upload('foo.ourdomain.com', 'test.txt', 'hello world', 'public-read');
Run Code Online (Sandbox Code Playgroud)
我认为这有用,但我得到了完全相同的错误.我已经进行了双重检查,并且在byte-for-byte异常中提到的端点与我在第二行中设置的端点匹配.
我也尝试使用foo.ourdomain.com.s3-website-eu-west-1.amazonaws.com作为端点(这是我们的CNAME根据S3控制台指令指向的主机).也没用.
我必须遗漏一些东西,但我无法在任何地方找到它.也许设置为"静态网站"的存储桶的行为方式与SDK当前不支持的方式不同?如果是这样,我在文档和管理控制台中都找不到它.
我必须根据(排序)集合的多个联合的交集得到结果.
例如
Intersect(Union(A,B), Union(C,D), E)
Run Code Online (Sandbox Code Playgroud)
这样做的显而易见的方法是将Union(A,B)和Union(C,D)存储在临时集中并使用最终交集命令中的那些.
但显然,这些临时集需要一个名称,尽管Redis是单线程的,如果我使用固定名称,我将遇到并发问题.
我的解决方案是在MULTI/EXEC块中进行整个'查询'(创建临时集,做我的交集,获取结果,删除临时密钥).
显而易见的替代方案是不使用MULTI/EXEC,而是为这些临时集使用足够随机的名称.
我的问题是:哪种更好/最佳做法?
前者可能带有性能(/其他线程的可用性)惩罚但后者增加了复杂性并且不保证不会导致并发问题.
在Lua中做到这一点并没有那么多,但我认为这会让它变得更加复杂.
我偶然发现了(imho相当糟糕的文档)事实,默认情况下,PHP PDO MYSQL_ATTR_DIRECT_QUERY为其MySQL驱动程序启用了标志.
这意味着它不是实际使用预准备语句,而是模拟预准备语句的行为.这意味着它使用转义值替换占位符客户端,并按原样将完整查询发送到数据库.
曾经有一个很好的理由这样做,因为在旧版本的MySQL预编译语句中会绕过查询缓存.但现在情况已经不是这样了.还有一点性能优势,因为它减少了从应用程序到数据库的往返次数,但我不确定这是值得的吗?
使用这种方法的明显缺点是我们仍然依赖于客户端转义,这通常是一个坏主意.我遇到了一些奇怪的问题,mysqli_real_escape_string过去由于某些字符集配置错误而允许无效字符进入查询.我宁愿不再有类似的事情再次发生.
我只是在这个问题上找到了半真半假和肤浅的评论(例如'是的,你可以启用'或'它会导致"问题"').寻找一个真正的原因,为什么我不打开它?在MySQL/PDO中使用实际准备好的语句无论如何都与模拟的预处理语句不兼容?
我问的部分原因是因为我们使用PHPActiverecord,它依赖于PDO.它不附带测试,我不希望它突然中断生产,因为关闭模拟的预准备语句会巧妙地改变某些边缘情况下的行为.
(作为旁注,在任何人提起之前:检查PDO::ATTR_EMULATE_PREPARES不起作用,因为它实际上没有(完全)为MySQL驱动程序实现,你必须检查PDO::MYSQL_ATTR_DIRECT_QUERY.是的,那个花了我一段时间.)
澄清:我想知道是否有充分的理由不关闭此行为.不是我不应该首先关心的原因.