我们在Windows服务器上运行PHP(确实是许多问题的根源,但目前不是迁移选项).有几点需要用户启动的操作才能启动一些需要一段时间的事情以及用户在成功或失败时不需要知道的事情,例如发送电子邮件或确认一些第三方帐户已更新.如果我可以使用fork pcntl_fork(),这将非常简单,但PCNTL功能在Windows中不可用.
似乎我能得到的最接近的是做这种性质的事情:
exec( 'php-cgi.exe somescript.php' );
Run Code Online (Sandbox Code Playgroud)
但是,这会复杂得多.我需要开始的行动依赖于已经存在于运行过程中的大量上下文; 使用上面的例子,我需要找出基本数据并以某种方式将它提供给新脚本.如果我可以分叉,那只是让父进程提前返回,让孩子继续处理更多事情.
我发现有一些人在谈论他们自己在Windows上编译各种PCNTL函数的工作,但似乎没有任何东西可用(破坏的链接等).
尽管这个问题与我的名字几乎同名,但似乎问题是执行超时比需要分叉更多.所以,我最好选择重构一下来处理调用php-cgi,还是有其他选择?
编辑:似乎exec()不适用于此,至少在没有我弄清楚它的其他方面时,因为它等待直到调用返回.我想我可以使用START,有点像exec( 'start php-cgi.exe somescript.php' );,但它仍然等待,直到另一个脚本完成.
假设我们有以下功能:
foo <- function(x)
{
line1 <- x
line2 <- 0
line3 <- line1 + line2
return(line3)
}
Run Code Online (Sandbox Code Playgroud)
我们想要改变第二行:
line2 <- 2
Run Code Online (Sandbox Code Playgroud)
你会怎么做?
一种方法是使用
fix(foo)
Run Code Online (Sandbox Code Playgroud)
并改变功能.
另一种方法是再次编写该函数.
还有另外一种方法吗?(记住,任务是改变第二行)
我想要的是某种方式将函数表示为字符串向量(好吧,字符),然后更改其中一个值,然后再将其转换为函数.
我有一个非常庞大且成熟的 C++ 代码库,我正在尝试使用 SWIG 为其生成 C# 接口。我无法更改实际的 C++ 代码本身,但我们可以使用 SWIG 提供的任何内容来扩展/更新它。我面临一个问题,如下所示编写的 C++ 函数会导致 C# 出现问题。
A* SomeClass::next(A*)
Run Code Online (Sandbox Code Playgroud)
调用者可能会执行以下操作:
A* acurr = 0;
while( (acurr = sc->next(acurr)) != 0 ){
if( acurr isoftype B ){
B* b = (B*)a;
...do some stuff with b..
}
elseif( acurr isoftype C )
...
}
Run Code Online (Sandbox Code Playgroud)
本质上,迭代元素容器,根据元素的真实类型,执行不同的操作。遗憾的是,SWIG 为“next”函数生成的 C# 层执行了以下操作:
return new A();
Run Code Online (Sandbox Code Playgroud)
因此,C# 中的调用代码无法确定返回的对象是否实际上是派生类,它实际上似乎始终是基类(这确实有道理)。我遇到过几种解决方案:
公共静态对象castTo(对象fromObj,类型toType)
{
对象 retval = … 朋友们,
我有一个奇怪的需要,无法思考我的问题.由于关键字回收,优秀而强大的Google几乎没有帮助(正如您所见).你能帮我吗?
我想要做的是将多种类型的数据存储在MySQL的单个列中.
这是一个等同于C联合的数据库(如果你搜索MySQL和Union,你显然在SQL中的UNION关键字上得到了很多东西).
[随后简化案例]因此,让我们说我们有人 - 有名字 - 和STORMTROOPERS - 有TK号码.您不能同时拥有名称和TK编号.你要么是BOB SMITH - 或者 - TK409.
在CI中可以将其表达为联盟,如下所示:
union {
char * name;
int tkNo;
} EmperialPersonnelRecord;
Run Code Online (Sandbox Code Playgroud)
这使得它,这样我要么存储一个指向字符数组或在类型EmperialPersonnelRecord的ID,但不是两者.
我在列上寻找MySQL等价物.我的列将存储int,double或varchar(255)(或任何组合).但只占用最大元素的空间.
这可能吗?
(当然,只要有足够的时间,金钱和意志,任何事情都是可能的 - 我的意思是,如果我是穷人,懒惰并且在截止日期之前有可能......也就是"开箱即用")
我理解每次更改文件时更新修改时间的默认Git行为,但有时我想恢复文件的原始修改时间.
有没有办法告诉Git这样做?
(例如,在处理大型项目时,我做了一些更改configure.ac,发现autotools在我的系统上不起作用,并希望将其恢复configure.ac到原始内容和修改时间,这样make就不会尝试configure用我破损的autotools 更新.)
我有一个格式为yyyyMMdd的字符串对象 .是否有一种简单的方法来获取具有相同格式的前一个日期的字符串?谢谢
我希望它像引用我现有的库一样简单,以便在WP7中使用它们.但是,当我实际使用它时,它抱怨因为.Net CF而无法加载它们.
我是否需要将它们重新编译为.NET CF或其他什么?
我认为WP7的最大优点是:利用现有的代码库......?如果我需要从中删除所有内容并维护多个版本,我如何利用现有的代码库?
如果用户尝试使用Paperclip将同一张照片两次上传到Rails应用程序,是否仍然会抛出验证错误?Paperclip似乎没有提供此功能......
我正在使用Rails 2.3.5和Paperclip(显然).
解决方案:(或至少其中一个)
使用Beerlington的建议,我决定使用MD5校验和比较:
class Photo < ActiveRecord::Base
#...
has_attached_file :image #, ...
before_validation_on_create :generate_md5_checksum
validate :unique_photo
#...
def generate_md5_checksum
self.md5_checksum = Digest::MD5.hexdigest(image.to_file.read)
end
def unique_photo
photo_digest = self.md5_checksum
errors.add_to_base "You have already uploaded that file!" unless User.find(self.user_id).photos.find_by_md5_checksum(photo_digest).nil?
end
# ...
end
Run Code Online (Sandbox Code Playgroud)
然后我刚刚在我的photos桌子上添加了一个专栏md5_checksum,瞧!现在,如果您尝试上传同一张照片,我的应用会抛出验证错误!
不知道这是多么高效/低效,所以重构是受欢迎的!
谢谢!
我的答案没有!因为按值传递并通过引用传递看起来与调用者相同.
但是,下面的代码编译正确
class A {
public:
void f(int i) {}
void f(int& i) {}
};
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用它时,会出现编译错误.
int main () {
A a;
int i = 9;
int& j = i;
a.f(1);
a.f(i);
a.f(j);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么即使不知道它将被使用,编译器也不会禁用它?