PHPUnit and Mongo with Phactory - mongodb

I am new to Unit testing and trying to use Phactory with Mongo, but when I run the test I keep getting the following error.
PHP Fatal error: Class 'Mongo' not found in /vagrant/Test/user/LoginTest.php on line 19
I know Mongo is installed because when I pull up the site it works, but for some reason PHPUnit isn't recognizing it.
I feel I am missing a step. Do I need to install the Mongo extension locally, or do I need to include the location in a config file somewhere?

Are you sure Mongo is installed as a module in the command line version of PHP?
Do a quick run of php -i and have a look at the output (which is phpinfo() without fancy formatting) or php -m for a list of modules. If the Mongo extension does not show up, you have to install it.
Also note that the Mongo class has been deprecated. You'd probably update to using MongoClient.

Related

Installing PHP 7.0.0RC2 with mysqli on Raspberry Pi B

Last week I installed PHP 7.0.0RC2 on my Raspberry Pi B.
I am able to view PHP pages, however, the problem is that I cannot connect to the database using mysqli (I know that mysql is no longer supported in PHP v7).
I ran the ./configure command with --with-mysqli=shared.
However, when I check which modules are installed using the php -m command, I do not see mysqli.
I tried adding extension=mysqli.so to the php.ini file.
It first complained that the mysqli.so file could not be found, so I tried copying the mysqli.so of my php5 version to the extensions folder.
However, this did not solve the problem and resulted in the following error message:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20141001/mysqli.so' - /usr/local/lib/php/extensions/no-debug-non-zts-20141001/mysqli.so: undefined symbol: zval_used_for_init in Unknown on line 0
Does anyone got any suggestions of how to get mysqli to work with my PHP7 installation on my Raspberry Pi?
You may find detailed information in the configure output, but it's pretty hard to catch, and if it's not a fatal error, won't stop the build going ahead when you make.
The recommended (read: only decent) driver for MySQLi is the MySQL Native Driver (mysqlnd).
If you want MySQLi to be built shared, you must also build mysqlnd shared, and everything that depends on it (PDO MySQL, for example).
It's going to be simpler to just build the native drivers static, using the configure option:
--with-mysqli=mysqlnd
Which will enable a static build of mysqlnd and mysqli.
If for some reason you really do want to build shared, then you'll need configure options that closely resemble, if not are exactly the same as:
--enable-mysqlnd=shared
--with-mysqli=shared,mysqlnd
Which will result in a shared build of mysqlnd and mysqli, requiring you to add extension=mysqlnd.so and extension=mysqli.so in the appropriate order (the latter depends on the former), in the appropriate place.
Remember to make distclean before you re-configure the build, surprising things will happen if you do not ;)

Meteor: mongoimport command not found

I'm using meteor and I need to use mongoimport to add some JSON-data to the DB. But when I try to start meteor import, I got the error command not found. This is surprising for me as mongoimport is part of mongoDB, so I expected this working.
So I guess I have to install MongoDB separately from meteor (using OS X). But what is the correct way to do that?
Of course I can do brew install mongodb. Or would it be better to download the mongodb-file manually, extract the archive and take the mongoimport-file?
I'm just worried to install mongodb, although I already have meteor installed and it works. I don't want to get two different mongoDB instances.
If you don't already have the mongoimport binary somewhere, just download MongoDB for OSX from their site, extract the archive somewhere, and use the mongoimport file that will be in its bin folder.
You won't get another daemon running unless you run another mongod and you are probably safest to avoid using brew so that it doesn't do something unintended.

Why can't I cabal install --only-dependencies with mongodb?

I have gone through the following steps:
$ mkdir mongoEg
$ cd mongoEg
$ cabal init
...
Configured to run as an executable. I add mongodb to the build-depends list. I make a dummy Main.hs file and put a basic hello world in there. I then do
$ cabal sandbox init
$ cabal install --only-dependencies
Which responds with:
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: monogEg-0.1.0.0 (user goal)
next goal: mongodb (dependency of monogEg-0.1.0.0)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
I read up on other problems people are having, and remove ~/.ghc, remove my mongoEg directory, and repeat to get the same results. I try to run through the analogous steps at http://howistart.org/posts/haskell/1 and find that everything works just fine.
I then guess that something is wrong with the mongodb package itself. I seem to be able to cabal install mongodb in a global environment and use it outside of a sandbox without any issue. So, why wont cabal sandboxes play with the mongodb package?
See this gist for details: https://gist.github.com/anonymous/e5a548cf7d9ec59bea31
After looking here
Cabal configure in a sandbox complains "At least the following dependencies are missing" on installed packages
I saw that the answer states that package names are case sensitive. So I tried changing mongodb to the way MongoDB spells it, namely MongoDB. This did not work, so I tried changing it to mongoDB, and finally there was joy.
So even though I can do cabal install mongodb I can't use that same spelling to install it from within a .cabal file, which is, obviously, completely stupid. I'm sure I'll find the right place to channel my rage about this kind of flagrant violation of the principle of least surprise, but for now I can say that to newcomers it is most needlessly confusing.

memcache install for MAMP using wrong API version

I'm attempting to install memcache for MAMP. It seems to configure/make/install fine but I'm getting an error saying the API version is wrong:
[26-Oct-2012 17:40:51 UTC] PHP Warning: PHP Startup: memcache: Unable to initialize module
Module compiled with module API=20090626
PHP compiled with module API=20100525
These options need to match
in Unknown on line 0
I am using MAMP 2.1.1 on OS X Mountain Lion.
I'm using this memcache build:
http://pecl.php.net/package/memcache/2.2.7
I extracted the archive into this directory:
/Applications/MAMP/bin/php/php5.4.4/include/memcache-2.2.7
And then ran these commands from the extracted directory:
/Applications/MAMP/bin/php/php5.4.4/bin/phpize
./configure
make
sudo make install
No errors except what I noted above, which I am seeing in:
/Applications/MAMP/logs/php_error.log
Any ideas on how to fix this?
Ok so after a few hours of trying to figure this out, I was able to find the problem and fix it. I'm pretty much a huge noob when it comes to all of this stuff, but here is the best I can explain what I think I figured out:
So, when I ran first ran phpize on the module, it was configured for my system's default installation of php. I had to point php and phpize to my PATH in my .bash_profile
export PATH=/Applications/MAMP/Library/bin:/Applications/MAMP/bin/php/php5.4.3/bin:/usr/local/bin:$PATH:/opt/local/bin
Make sure to change the php version to what ever version you are running.
After adding this to your path, running phpize -v should return:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
and running which phpize should return: /Applications/MAMP/bin/php/php5.4.3/bin/phpize
So then it was just a matter of deleting all of the files that were installed the first time, and running through the installation process again. I unzipped the downloaded file cd into the unzipped folder and ran:
/Applications/MAMP/bin/php/php5.4.3/bin/phpize
./configure
make
cp modules/memcache.so /Applications/MAMP/bin/php/php5.4.3/lib/php/extensions/no-debug-non-zts-20100525/
And boom done. It works!
This article helped me out a lot, even though it isn't related to memcache: http://drupal.org/node/1464236

pecl not working on php CLI mode (involving mongoDB in Gearman)

For test purposes I have gearman running on localhost. So I run the gearman worker.php file from php command line. When I test this in normal apache mode, mongoDB works just fine, but when it runs from the gearman worker file I get the error "fatal error: class 'Mongo' not found". Now the Mongo class comes from pecl and the mongo.so extension in php.ini. SO yeah, trying to figure out why a php file run from CLI is different. Does it use a separate php.ini file?
You can check which .ini files are being loaded by the CLI version by doing php --ini. If your PHP was provided by a distro, it's very possible for it to have two seperate .ini sets, one for web-based and one for CLI. You can get the equivalent info from phpinfo() when it's running online as well.
To force it to load a particular .ini, you can use php -c /path/to/file.ini.
Well a simple find / -name php.ini answered that question for me. So yes, there is a separate php.ini file. Where I needed to add the line extension=mongo.so.
It sounds like either you're loading different ini files or you've got multiple instances of php installed on your machine and apache is using a different one. Make the script v.php:
<?php phpinfo();
then try running it from CLI and then viewing it via localhost. EG:
php v.php
and
http://localhost/v.php